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

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

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

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

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

@IdClass基本上是EJB 2.1的剩余部分,可以更容易地从BMP迁移。 在其他一些罕见的角落情况下,它也可能比@EmbeddedId更好。 但是,一般来说@EmbeddedId更好更多OO,因为它在对象中更好地封装了关键字的概念。

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

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

正如Pascal在这里写的那样:

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

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

你总是要记住哪些属性是PK的一部分,哪些属性不属于PK。 这使得不必要地编写JPQL查询变得复杂。

此外,AFAIK JPA 2.0规范允许您将@Id放到@XToX / @JoinColumn / s属性上,它引入了@MapsId注释,因此映射标识关系(也就是JPA中的派生标识符)更自然地实现。

I.记得使用idclass来做。 但我建议你尽一切可能避免使用多字段键。 他们只是创造额外的工作。