对JPA / Hibernate复合主键,@ IdClass或@EmbeddedId实现有什么好处?为什么?
这是一个故意天真的问题。我决定使用@EmbeddedId(无论出于何种原因),我觉得我做出了错误的选择。取消引用包含列属性的embeddedId是多余的,并且在编码时非常容易出错。
是否有更多理由和/或反对另一个?是JPA(规范)的推荐吗?
答案 0 :(得分:8)
首先,如果可能,不惜一切代价避免使用复合ID。但如果你真的需要,我会推荐@EmbeddedId
。
@IdClass
基本上是EJB 2.1的剩余时间,以便从BMP迁移变得更容易。在其他一些罕见的极端情况下,它也可能比@EmbeddedId
更好。但是,通常@EmbeddedId
更好,更多OO,因为它在对象中更好地封装了关键字的概念。
如果您需要,请在关键字段中使用@AttributeOverride(s)
。
我不明白为什么你认为取消引用嵌入式id是多余的,容易出错。
答案 1 :(得分:7)
正如Pascal在这里写的那样:
Which annotation should I use: @IdClass or @EmbeddedId
最后,我相信在实践中使用@IdClass
要容易得多,因为你必须将embeddedId
属性名称添加到取消引用PK属性,而这些属性不是为所有非PK写的属性。
您始终必须准确记住哪些属性是PK的一部分而哪些属性不属于PK。这使得不必要地编写JPQL查询变得复杂。
此外,AFAIK JPA 2.0规范允许您将@Id
放到@XToX
/ @JoinColumn
/ s属性上,并引入@MapsId
注释,以便映射标识关系(在JPA中也称为派生标识符)更自然地实现。
答案 2 :(得分:2)
予。记得使用idclass来做。但我建议你尽一切可能避免使用多字段键。他们只是创造了额外的工作。