Java JPA/Hibernate:What';复合主键、@IdClass或@EmbeddedId实现更好,为什么?
对于JPA/Hibernate复合主键、Java JPA/Hibernate:What';复合主键、@IdClass或@EmbeddedId实现更好,为什么?,java,hibernate,jpa,composite-primary-key,Java,Hibernate,Jpa,Composite Primary Key,对于JPA/Hibernate复合主键、@IdClass或@EmbeddedId实现,什么更好?为什么 这是一个故意天真的问题。我决定使用@EmbeddedId(无论出于何种原因),我觉得我做出了错误的选择。在编码时,取消引用包含列属性的embeddedId是多余的,并且非常容易出错 是否还有其他支持和/或反对的理由?这是JPA(spec)的推荐吗?正如帕斯卡所写,这是答案的一部分: 最后,我相信在实践中使用@IdClass要容易得多,因为您必须添加embeddedId属性名来取消对PK属性的
@IdClass
或@EmbeddedId
实现,什么更好?为什么
这是一个故意天真的问题。我决定使用@EmbeddedId
(无论出于何种原因),我觉得我做出了错误的选择。在编码时,取消引用包含列属性的embeddedId是多余的,并且非常容易出错
是否还有其他支持和/或反对的理由?这是JPA(spec)的推荐吗?正如帕斯卡所写,这是答案的一部分: 最后,我相信在实践中使用
@IdClass
要容易得多,因为您必须添加embeddedId
属性名来取消对PK属性的引用,而这些属性并不是为所有非PK属性编写的
您必须始终准确地记住哪些属性是PK的一部分,哪些属性不是。这使得不必要地编写JPQL查询变得复杂
此外,JPA2.0规范允许您将
@Id
放在@XToX
/@JoinColumn
/s属性上,它引入了@MapsId
注释,因此映射标识关系(也称JPA中的派生标识符)更容易实现。I.记住使用idclass来实现它。但我建议您尽可能避免使用多字段键。它们只会创建额外的工作。首先,如果可能,不惜一切代价避免使用复合ID。但如果您真的需要,我建议您使用@EmbeddedId
@IdClass
基本上是EJB2.1时代的遗留产品,可以更轻松地从BMP迁移。在其他一些罕见的情况下,它也可能比@EmbeddedId
更好。然而,一般来说,@EmbeddedId
更好,因为它在对象中更好地封装了键的概念
如果需要,您可能需要在密钥字段中使用@AttributeOverride
我不明白为什么您认为取消对嵌入式id的引用是多余的,而且容易出错。似乎是这样。但它没有列出更多的原因。是的,你最后一句话是对的。如果使用JPA 2.0语法,实体类上就不会有任何冗余字段,因此您必须始终取消对联接列的引用,这对于所有4个复合键变量JPA 1.0@IdClass、JPA 1.0@EmbeddedId、JPA 2.0@IdClass来说似乎都更可取,和JPA 2.0@EmbeddedId。你能解释为什么复合ID不好吗?给出+1,因为它确实让我们使用复合PK重新评估,并得出结论,我们最好不使用它们。有时,特别是在使用旧模式时,正确映射实体的唯一方法是使用复合PKs。当然,在设计新模式时,最好避免使用它们(如果可能的话)。