我正在使用JPA+Spring Boot将一些数据持久化到数据库中。
我上了两节课:Plantilla
(模板)和Campo
(野外)。Plantilla
有一个ID,即它的PrimaryKey(PK)。Campo
有一个复合PK(id_Plantilla,Campo_name)。id_plantilla
是来自Plantilla
的外键。我使用了CampoPK,这是一个@Embeddable
类
我用@OneToMany @ManyToOne
注解Map了Plantilla和Campo之间的关系。
所以代码是这样的:
Plantilla类
@Entity
@Table(name = "plantillas")
public class Plantilla implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id_plantilla")
private Long id_plantilla;
@Column(length = 50)
private String nombre;
@Column(length = 50)
private String proveedor;
@OneToMany(mappedBy = "plantilla",cascade=CascadeType.ALL)
List<Campo> campos = new ArrayList<>();
//getters and setter
Campo类
@Entity
@Table(name = "campos")
public class Campo implements Serializable{
@EmbeddedId
private CampoPK campoPK;
@ManyToOne(optional = false)
@JoinColumn(name="id_plantilla", referencedColumnName="id_plantilla",
insertable=false, updatable=false)
private Plantilla plantilla;
@Column(length = 50)
private double coordX;
@Column(length = 50)
private double coordY;
CampoPK
@Embeddable
public class CampoPK implements Serializable{
@Column(name="id_plantilla",nullable=false)
private Long idPlantilla;
@Column(name="campo_nombre",nullable=false)
private String campoNombre;
所以,当我启动这款应用程序时。它与数据库连接,并正确创建表。Table Campo in DB
现在,这个应用程序是一个服务器,当它被部署时,它有一个REST API,你可以调用(我用简单的表测试了它,并正确地插入了发送的对象)。id_plantilla
是自动生成的,所以当我发送带有一些Campo
的Plantilla
时,对象Plantilla没有id。它有campoNombre
,这是主键的另一个字段
因此,为了进行测试,我发送了一个Plantilla,其中包含2 Campo的对象(材质和尺寸)。当发送SQLQuery时(在接受HttpRequest之后),它不具有所需的值,输出是下一个:
为了更清楚地说明,我删掉了信息消息的第一部分,它们都是这样的:
2022-05-26 23:09:35.064 DEBUG 13148 --- [nio-8080-exec-4] o.h.e.t.internal.TransactionImpl :
-首先:看起来ID已经生成,实体被识别,ID添加到Plantilla中,但没有添加到Campo实体上,也不在Plantilla中的列表-Campo上。
Generated identifier: 1, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
Generated identifier: component[campoNombre,id_plantilla]{id_plantilla=null, campoNombre=material}, using strategy: org.hibernate.id.CompositeNestedGeneratedValueGenerator
Generated identifier: component[campoNombre,id_plantilla]{id_plantilla=null, campoNombre=dimensiones}, using strategy: org.hibernate.id.CompositeNestedGeneratedValueGenerator
committing
Processing flush-time cascades
Dirty checking collections
Collection found: [com.servidorAPELV.springbootServer.entity.Plantilla.campos#1], was: [<unreferenced>] (initialized)
Flushed: 3 insertions, 0 updates, 0 deletions to 3 objects
Flushed: 1 (re)creations, 0 updates, 0 removals to 1 collections
Listing entities:
com.servidorAPELV.springbootServer.entity.Campo{coordX=2.0, coordY=2.0, plantilla=null, campoPK=component[campoNombre,id_plantilla]{id_plantilla=null, campoNombre=material}, longX=4.0, longY=1.5}
com.servidorAPELV.springbootServer.entity.Campo{coordX=2.0, coordY=4.0, plantilla=null, campoPK=component[campoNombre,id_plantilla]{id_plantilla=null, campoNombre=dimensiones}, longX=5.0, longY=3.0}
com.servidorAPELV.springbootServer.entity.Plantilla{id_plantilla=1, proveedor=syscam, campos=[com.servidorAPELV.springbootServer.entity.Campo#component[campoNombre,id_plantilla]{id_plantilla=null, campoNombre=material}, com.servidorAPELV.springbootServer.entity.Campo#component[campoNombre,id_plantilla]{id_plantilla=null, campoNombre=dimensiones}], nombre=Prueba plantilla 1}
-其次,我们将SQL发送到数据库:
insert into plantillas (nombre, proveedor, id_plantilla) values (?, ?, ?)
Hibernate: insert into plantillas (nombre, proveedor, id_plantilla) values (?, ?, ?)
insert into campos (coordx, coordy, longx, longy, campo_nombre, id_plantilla) values (?, ?, ?,
?, ?, ?)
Hibernate: insert into campos (coordx, coordy, longx, longy, campo_nombre, id_plantilla)
values (?, ?, ?, ?, ?, ?)
o.h.engine.jdbc.spi.SqlExceptionHelper : could not execute statement [n/a]
我不明白为什么所有值都以“?”出现。
-最后,它显示以下消息:
java.sql.SQLIntegrityConstraintViolationException: Column 'id_plantilla' cannot be null
//A bit forward appears this
2022-05-26 23:09:35.153 WARN 13148 --- [nio-8080-exec-4]o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1048, SQLState: 23000
2022-05-26 23:09:35.153 ERROR 13148 --- [nio-8080-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper : Column 'id_plantilla' cannot be null
2022-05-26 23:09:35.154 INFO 13148 --- [nio-8080-exec-4] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements
2022-05-26 23:09:35.158 DEBUG 13148 --- [nio-8080-exec-4] cResourceLocalTransactionCoordinatorImpl : JDBC transaction marked for rollback-only (exception provided for stack trace)
如果有人对正在发生的事情有任何想法,或者有任何潜在的解决方案或教程可以查看,我将非常感激。
Pd(因为我还不能上传照片,我会在这里添加输出的完整图像):Output error
1条答案
按热度按时间zphenhs41#
好的,你的问题似乎已经有一段时间了,我在这里看不到正确的答案,但它仍然可能对其他人有帮助。我认为您的问题是MySQL不支持生成类型
AUTO
或SEQUENCE
。因此,您需要使用TABLE
或IDENTITY
,第一个更好。https://thorben-janssen.com/5-things-you-need-to-know-when-using-hibernate-with-mysql/