Java JPA使用GenerationType.IDENTITY@onetomany Postgres子(多)表插入失败:父FK上的NOTNULL约束错误
一支球队有很多球员。使用JPA/Hibernate。博士后9.1。GenerationType.IDENTITY(Postgres在int列上使用序列,如Oracle)。在一个新的insert中,当I em.persist()时,我在子表(在我的非常非常轻微的模糊代码中的player表…名称被更改以保护无辜者)上得到了一个NOTNULL错误。错误信息如下 父表Java JPA使用GenerationType.IDENTITY@onetomany Postgres子(多)表插入失败:父FK上的NOTNULL约束错误,java,jpa,one-to-many,identity,constraintexception,Java,Jpa,One To Many,Identity,Constraintexception,一支球队有很多球员。使用JPA/Hibernate。博士后9.1。GenerationType.IDENTITY(Postgres在int列上使用序列,如Oracle)。在一个新的insert中,当I em.persist()时,我在子表(在我的非常非常轻微的模糊代码中的player表…名称被更改以保护无辜者)上得到了一个NOTNULL错误。错误信息如下 父表 @Entity @Table(name = "team") public class Team implements Serializa
@Entity
@Table(name = "team")
public class Team implements Serializable {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
@Column(name = "teamid")
private Long teamid;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "teamid", fetch = FetchType.LAZY)
private Collection<Player> playerList;
persistence.xml的良好度量:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="ELS_Soulard_PU" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/ElsDev1Pool</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties/>
</persistence-unit>
</persistence>
请注意,如果我将玩家排除在等式之外,即在“Team”类中,玩家属性的值设置为null(我注释掉将玩家列表添加到属性的代码),则数据将成功插入到Team表中。问题全在球员身上。(只要问问多伦多枫叶店的老板就知道了。:p)
是否是GenerationType.IDENTITY导致了问题?i、 e.在事务结束之前,不会返回父表中的teamid,因此不能将其作为FK放在player表中?如果是这样,除了使用不同的一代类型之外,还有什么补救措施吗?我喜欢使用数据库序列(更多控制imho)
序列生成类型更好还是相同的问题?但我相信一定有办法做到这一点。不是吗?:/
将ID更改为如下所示(即让hibernate生成): 现在我得到了这个错误:
INFO: EXCEPTION CLASS NAME: javax.persistence.PersistenceException
INFO: THROWABLE CLASS NAME: org.hibernate.id.IdentifierGenerationException
啊 所以这里唯一的错误是我对表连接和JPA类型ORM工作原理的理解(我以前与MyBatis合作过,所以仍在学习JPA)。事实证明,即使直觉上你会认为我可以向我的团队类添加数据,包括我的球员的arraylist,然后将其持久化,但你不能。您必须首先坚持团队,然后依次将团队添加到每个玩家,然后一次坚持一个。所以从本质上说,这段代码没有错。问题出在椅子和电脑之间。:/自那以后,它被纠正了
INFO: THROWABLE INFO: org.postgresql.util.PSQLException: ERROR: null value in column "teamid" violates not-null constraint
INFO: Team Controller persistence exception THROWABLE MESSAGE: could not insert: [com.mydomainblahblahblah.persistence.entity.Player]
@Id
@Column(name = "teamid")
private Long teamid;
INFO: EXCEPTION CLASS NAME: javax.persistence.PersistenceException
INFO: THROWABLE CLASS NAME: org.hibernate.id.IdentifierGenerationException