I'm a novice in JPA please stay with me.
显然,如何在属性访问方式中从外键创建复合主键是毫无疑问的 .
Question
如果我使用属性访问类型,如下例所示,我是否还必须为引用的FK定义getter和setter?
我不认为那是这种情况,但Java EE6的official documentation是这样的 .
Oracle® Containers for J2EE Enterprise JavaBeans Developer's Guide
复合主键类具有以下特征:它是POJO类 . 它必须是公共的,并且必须具有公共无参数构造函数 . 如果使用基于属性的访问,则主键类的属性必须是公共的或受保护的 . 它必须是可序列化的 . 它必须定义equals和hashCode方法 . 这些方法的值相等的语义必须与键映射到的数据库类型的数据库相等性一致 . 您可以使复合主键类成为实体类拥有的嵌入类,或者将非字符串类映射到实体类的多个字段或属性 . 在后一种情况下,复合主键类中的主键字段或属性的名称以及实体类的名称必须对应,并且它们的类型必须相同 .
我修改了这个例子,因为我想使用FK .
Example 7-2 Embeddable Composite Primary Key Class
@Embeddable
public class EmployeePK implements Serializable {
private String name;
private long id;
public EmployeePK() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public int hashCode() {
return (int) name.hashCode() + id;
}
public boolean equals(Object obj) {
if (obj == this) return true;
if (!(obj instanceof EmployeePK)) return false;
if (obj == null) return false;
EmployeePK pk = (EmployeePK) obj;
return pk.id == id && pk.name.equals(name);
}
}
Example 7-3 JPA Entity With an Embedded Composite Primary Key Class
@Entity
@Access(AccessType.PROPERTY)
public class Employee implements Serializable {
EmployeePK primaryKey;
public Employee() {
}
@EmbeddedId
public EmployeePK getPrimaryKey() {
return primaryKey;
}
public void setPrimaryKey(EmployeePK pk) {
primaryKey = pk;
}
@ManyToOne
@MapsId("id")
private classWithPKid fkobject1;
@ManyToOne
@MapsId("name")
private classWithPKname fkobject2;
...
}
1 回答
JPA Spec(2.3.2) - 显式访问类型
JPA规范(2.3.3) - 可嵌入类的访问类型
当AccessType设置为实体类的PROPERTY时,提供程序将使用这些方法来获取持久状态和映射数据 . 当类的AccessType为PROPERTY时,持久性提供程序没有义务在字段上查找映射注释 . 另请注意,AccessType是由Embedded类继承的,这也是EmployeePK也需要定义getter / setter的原因 . 根据规范中的内容,当实体类使用Access(PROPERTY)时,您应该执行以下操作之一:
例:
例: