Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA/Hibernate:What';复合主键、@IdClass或@EmbeddedId实现更好,为什么?_Java_Hibernate_Jpa_Composite Primary Key - Fatal编程技术网

Java JPA/Hibernate:What';复合主键、@IdClass或@EmbeddedId实现更好,为什么?

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属性的

对于JPA/Hibernate复合主键、
@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。当然,在设计新模式时,最好避免使用它们(如果可能的话)。