JPA(Java持久性API)规范有两种不同的方法来指定实体组合键:@IdClass@EmbeddedId

我在映射的实体上同时使用了两个注释,但是对于对JPA不太熟悉的人来说,这真是一个大麻烦。

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

最佳答案

我认为@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提倡的自然语言不同。但是大多数时候,从查询中正确了解给定字段是组合键的一部分是非常有用的。

07-27 13:34