尝试级联持久子实体时出现 PersistenceException

PersistenceException while trying to cascade persist child entity

我有 2 个实体:

大师:

@Entity
@Table(name = "master")
public class Master implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "seq")
    private Integer seq;

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "seq", referencedColumnName = "seq")
    private SubMaster subMaster;


    ...................

}

子大师:

@Entity
@Table(name = "sub_master")
public class SubMaster implements java.io.Serializable {

    @Id
    @Column(name = "seq")
    private Integer seq;

    private String subName;


    ...................

}

当我尝试通过设置 SubMaster 实体来保留 Master 实体时,出现以下异常:

javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned beforeQuery calling save(): SubMaster

然而,我希望 Hibernate 在持久化父实体时自动持久化子实体。

也为 SubMaster 添加 @GeneratedValue(strategy = IDENTITY),似乎是 SubMaster 的 id 产生了异常

首先你颠倒了关联的所有者,因为我认为 subMaster 应该有 @JoinColumn 注释。

现在寻找解决方案

取决于 JPA 版本:

-2.0 你可以在关系注释上定义 @Id 注释这样你就可以有类似

@Entity
@Table(name = "master")
public class Master implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "seq")
    private Integer seq;

    @OneToOne(mappedBy = "master", cascade = CascadeType.ALL)
    private SubMaster subMaster;

}

@Entity
@Table(name = "sub_master")
public class SubMaster implements java.io.Serializable {

    @Id
    @JoinColumn(name = "seq", referencedColumnName = "seq")
    @OneToOne
    private Master master;

    private String subName;

}

你在哪里告诉你的子实体使用父实体的 id

master.setSubMaster(subMaster);
subMaster.setMaster(master)

-1.0 你几乎被困住了,因为你被迫将 @Id 放在基本注释上,所以你需要将 id 和关系列分开,问题是 @GeneratedValue您被迫先保存父项,然后在保存之前手动将 id 设置为子项

参考:https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships