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

新手上路,请多包涵

JPA (Java Persistence API)规范有两种不同的方式来指定实体复合键: @IdClass@EmbeddedId

我在我的映射实体上使用了这两个注释,但事实证明这对不太熟悉 JPA 的人来说是一团糟。

我只想采用一种方式来指定组合键。哪一个真的是最好的?为什么?

原文由 sakana 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

我认为 @EmbeddedId 可能更冗长,因为使用 @IdClass 您无法使用任何字段访问运算符访问整个主键对象。使用 @EmbeddedId 你可以这样做:

 @Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
  @EmbeddedId EmployeeId employeeId;
  ...
}

这给出了组成复合键的字段的清晰概念,因为它们都聚集在一个类中,该类通过字段访问运算符访问。

@IdClass@EmbeddedId 的另一个区别是在编写 HQL 时:

使用 @IdClass 你写:

从员工 e 中选择 e.name

@EmbeddedId 你必须写:

从员工 e 选择 e.employeeId.name

您必须为同一个查询编写更多文本。有些人可能会争辩说,这与 IdClass 提倡的那种更自然的语言不同。但大多数时候,从查询中理解给定字段是复合键的一部分是非常有用的。

原文由 Jorge Ferreira 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏