JPA 使用 GenerationType.IDENTITY @onetomany Postgres 子(许多)表插入失



给定一支球队有很多球员。使用 JPA/Hibernate。邮政 9.1.GenerationType.IDENTITY(Postgres在像Oracle这样的int列上使用序列(。当我 em.persist(( 时,在新插入时,我在子表上收到一个非空错误(我非常非常稍微混淆的代码中的播放器表......为了保护无辜者,改了名字。:) 下面的错误信息。

父表

@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;

子表

@Entity
@Table(name = "player")
@XmlRootElement
public class Player implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "playerid")
    private Long playerid;
    @JoinColumn(name = "teamid", referencedColumnName = "teamid")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Team teamid;

坚持不懈.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>

错误信息:

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]

请注意,如果我将球员排除在等式之外,即在"Team"类中,球员属性的值设置为 null(我注释掉将球员列表添加到属性的代码(,数据将成功插入到球队表中。问题全部出在球员身上。(只要问问多伦多枫叶的老板,:p(。

可能是 GenerationType.IDENTITY 导致了问题吗?即在事务结束之前没有返回父表中的 teamid,因此它不能作为 FK 放置在玩家表中?如果是这样,除了使用不同的世代类型之外,还有其他补救措施吗?我喜欢使用数据库序列(恕我直言,更多的控制(。

序列生成类型会更好还是相同的问题?但我相信必须有一些方法可以做到这一点。不是吗?:/


将 ID 更改为如下所示(即让休眠生成它们(:

@Id
@Column(name = "teamid")
private Long teamid;

现在我收到此错误:

INFO: EXCEPTION CLASS NAME: javax.persistence.PersistenceException
INFO: THROWABLE CLASS NAME: org.hibernate.id.IdentifierGenerationException

呸!

所以这里唯一的错误是我对表连接和 JPA 类型 ORM 如何工作的理解(我以前使用 MyBatis 工作过,所以还在学习 JPA(。事实证明,即使直觉上你会认为我可以向我的团队类添加数据,包括我的球员的数组列表,然后保留它,但你不能。您必须首先保留团队,然后依次将团队添加到每个玩家,然后一次保留一个。所以从本质上讲,这段代码没有任何问题。问题出在椅子和电脑之间。:/此后已得到纠正。

最新更新