hibernate - 如何在@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]]
但是当我查看我的数据库时,我的对象已经创建。我不明白我的错误,我不知道如何解决我的问题。
我找到了一些类似我的主题,但我还没有找到我的问题的答案。
@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
}
在此先感谢您的帮助。
解决方案
看起来你不能使用
@GeneratedValue
with@EmbeddedId
。您可以在本文中找到一些解决方法,但对我来说效果不佳。正如本节文档中所述,应该可以使用
@GeneratedValue
with@IdClass
。但是,由于HHH-9662,它不起作用。正如文档的本节所述:
使用复合标识符时,基础标识符属性必须由用户手动分配。
不支持使用自动生成的属性来生成构成复合标识符的基础属性的值。
因此,您不能使用生成的属性部分描述的任何自动属性生成器,例如
@Generated
、@CreationTimestamp
或@ValueGenerationType
或数据库生成的值。尽管如此,您仍然可以在构造复合标识符之前生成标识符属性。
推荐阅读
- typescript - Visual Studio 2017 Asp.Net Core 2.1 TypeScript Vue 设置 - 不是 SPA
- c# - 为什么霍尼韦尔 POS4NET 会为两个不同的扫描仪触发相同的事件?
- unity3d - 使用 Quaternion.Lerp 平滑旋转
- javascript - 如何从多个 ID 中获取单个 ID
- php - 如何将 YouTube 链接嵌入 PHP
- db2 - 使用子选择更新查询
- mysql - 如何在另一个函数中调用一个函数(nodejs,mysql)
- php - 如何检查数组键的长度值是否大于 1
- node.js - 在节点中使用 ffmpeg,而不使用 fluent-ffmpeg
- sql - SQL - 找出用户没有执行权限的存储过程。