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

Kaw*_*awu 26 java hibernate jpa composite-primary-key

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

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

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

Vic*_*usa 9

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

@IdClass基本上是EJB 2.1的剩余部分,以便从BMP迁移更容易.在其他一些罕见的角落情况下,它可能也会更好@EmbeddedId.然而,通常@EmbeddedId是更好和更多的OO,因为它在对象中更好地封装了概念.

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

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


Kaw*_*awu 7

帕斯卡写到这里是答案的一部分:

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

最后,我认为@IdClass在实践中使用起来要容易得多,因为您必须将embeddedId属性名称添加到取消引用PK属性,而这些属性不是针对所有非PK属性编写的.

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

此外,AFAIK的JPA 2.0规范允许把@Id@XToX/ @JoinColumn/ s的性质和它介绍了@MapsId注释,以便标识映射关系(又名衍生标识符在JPA)更自然地实现.