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