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

时间:2010-10-26 14:37:26

标签: java hibernate jpa composite-primary-key

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

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

是否有更多理由和/或反对另一个?是JPA(规范)的推荐吗?

3 个答案:

答案 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来做。但我建议你尽一切可能避免使用多字段键。他们只是创造了额外的工作。