JPA
(Java Persistence API)规范有两种不同的方式来指定实体复合键: @IdClass
和 @EmbeddedId
我在我的映射实体上使用了这两个注释,但事实证明这对不太熟悉 JPA
的人来说是一团糟。
我只想采用一种方式来指定组合键。哪一个真的是最好的?为什么?
原文由 sakana 发布,翻译遵循 CC BY-SA 4.0 许可协议
JPA
(Java Persistence API)规范有两种不同的方式来指定实体复合键: @IdClass
和 @EmbeddedId
我在我的映射实体上使用了这两个注释,但事实证明这对不太熟悉 JPA
的人来说是一团糟。
我只想采用一种方式来指定组合键。哪一个真的是最好的?为什么?
原文由 sakana 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用复合主键的三种策略:
@Embeddable
并为您的实体类添加一个普通属性,标记为 @Id
。@EmbeddedId
。@Id
@IdClass
实体类,提供主键类的类。将 @Id
与标记为 @Embeddable
的类一起使用是最自然的方法。 @Embeddable
标签无论如何都可以用于非主键可嵌入值。它允许您将复合主键视为单个属性,并允许在其他表中重用 @Embeddable
类。
下一个最自然的方法是使用 @EmbeddedId
标签。在这里,主键类不能在其他表中使用,因为它不是 @Embeddable
实体,但它确实允许我们将键视为某个类的单个属性。
最后,使用 @IdClass
和 @Id
注释允许我们使用与主键类中的属性名称相对应的实体本身的属性来映射复合主键类。 名称必须对应(没有覆盖这一点的机制),并且主键类必须履行与其他两种技术相同的义务。这种方法的唯一优点是它能够从封闭实体的接口中“隐藏”主键类的使用。 @IdClass
注解带有一个Class类型的值参数,必须是要作为复合主键的类。 要使用的主键类的属性对应的字段必须全部用 @Id
注解。
参考:http: //www.apress.com/us/book/9781430228509
原文由 Adelin 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.6k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
我认为
@EmbeddedId
可能更冗长,因为使用@IdClass
您无法使用任何字段访问运算符访问整个主键对象。使用@EmbeddedId
你可以这样做:这给出了组成复合键的字段的清晰概念,因为它们都聚集在一个类中,该类通过字段访问运算符访问。
@IdClass
和@EmbeddedId
的另一个区别是在编写 HQL 时:使用
@IdClass
你写:和
@EmbeddedId
你必须写:您必须为同一个查询编写更多文本。有些人可能会争辩说,这与
IdClass
提倡的那种更自然的语言不同。但大多数时候,从查询中理解给定字段是复合键的一部分是非常有用的。