首页 > 解决方案 > 如何在@Embeddable 中使用@GeneratedValue 作为复合主键?

问题描述

我的数据库中有一个带有主复合键的表,当我使用 Hibernate 对其进行建模时,我使用@EmbeddedId& @Embedable。此复合主键的一列具有生成的值@GeneratedValue(strategy = GenerationType.IDENTITY)

当我尝试在我的数据库中创建两个新对象时,出现如下错误:

org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [MyPackage#MyEmbedableClass [MyGeneratedPrimaryKeyValue=null, OtherPrimaryKey=21]]

但是当我查看我的数据库时,我的对象已经创建。我不明白我的错误,我不知道如何解决我的问题。

我找到了一些类似我的主题,但我还没有找到我的问题的答案。

  1. 第一个例子

  2. 第二个例子

  3. 第三个例子

@Entity(name = "Certification")
@Table(name = "CERTIFICATION")
public class Certification implements Serializable {

    static final long serialVersionUID = -4399907743392740963L;

    @EmbeddedId
    private CertificationPK certificationPK;

    // Others variables
    // constructors
    // Getter / Setter
    // toString
    // hashCode / equals
}

@Embeddable
public class CertificationPK implements Serializable {

    private static final long serialVersionUID = 1433990897506209802L;

    // MyGeneratedPrimaryKeyValue=null when I create
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @NotNull
    @Column(name = "CERTIFICATION_ID")
    private Integer certificationId; 

    // Other variable
    // constructors
    // Getter / Setter
    // toString
    // hashCode / equals
}

在此先感谢您的帮助。

标签: hibernateprimary-keycompositeauto-generate

解决方案


  1. 看起来你不能使用@GeneratedValuewith @EmbeddedId您可以在本文中找到一些解决方法,但对我来说效果不佳。

  2. 正如节文档中所述,应该可以使用@GeneratedValuewith @IdClass但是,由于HHH-9662,它不起作用。

  3. 正如文档的节所述:

使用复合标识符时,基础标识符属性必须由用户手动分配。

不支持使用自动生成的属性来生成构成复合标识符的基础属性的值。

因此,您不能使用生成的属性部分描述的任何自动属性生成器,例如@Generated@CreationTimestamp@ValueGenerationType或数据库生成的值。

尽管如此,您仍然可以在构造复合标识符之前生成标识符属性。


推荐阅读