JPA/Hibernate:对于复合主键,@IdClass或@EmbeddedId实现,什么更好,为什么?

2022-09-01 16:12:50

对于 JPA/休眠复合主键或实现,什么更好,为什么?@IdClass@EmbeddedId

这是一个故意天真的问题。我决定使用(无论出于何种原因),我觉得我做出了错误的选择。取消引用包含列属性的嵌入式 Id 是多余的,并且在编码时非常容易出错。@EmbeddedId

有没有更多支持和/或反对他人的理由?这是JPA(规范)的建议吗?


答案 1

首先,如果可能的话,不惜一切代价避免复合ID。但是,如果您真的需要,我会推荐。@EmbeddedId

@IdClass基本上是 EJB 的 2.1 倍的剩余部分,以便更轻松地从 BMP 迁移。在其他一些罕见的角落情况中,它可能也比它更好。但是,通常更好,更OO,因为它在对象中更好地封装了关键的概念。@EmbeddedId@EmbeddedId

如果需要,您可能需要在键字段中使用。@AttributeOverride(s)

我不明白为什么你认为取消引用嵌入式ID是多余的并且容易出错。


答案 2

正如帕斯卡所写的那样,这是答案的一部分:

我应该使用哪个注释:@IdClass或@EmbeddedId

最后,我相信在实践中使用要容易得多,因为您必须添加属性名称来取消引用PK属性,而这些属性并不是为所有非PK属性编写的。@IdClassembeddedId

您始终必须准确记住哪些属性是PK的一部分,哪些不是PK的一部分。这使得编写JPQL查询变得不必要。

此外,AFAIK JPA 2.0 规范允许您放入 //s 属性,并引入注释,以便映射标识关系(在 JPA 中称为派生标识符)更自然地实现。@Id@XToX@JoinColumn@MapsId


推荐