@AssociationOverride
默认情况下,JPA 持续性提供程序自动假设子类继承超类中定义的持久属性及其关联映射。
如果继承的列定义对实体不正确(例如,如果继承的列名与已经存在的数据模型不兼容或作为数据库中的列名无效),请使用 @AssociationOverride
批注自定义从 @MappedSuperclass 或 @Embeddable 继承的 @OneToOne 或 @ManyToOne 映射,以更改与字段或属性关联的 @JoinColumn。
如果有多个要进行的 @AssociationOverride
更改,则必须使用 @AssociationOverrides。
要自定义基本映射以更改它的 @Column,请使用 @AttributeOverride。
表 1-4 列出了此批注的属性。有关更多详细信息,请参阅 。有关更多详细信息,请参阅 API。
示例 1-4 显示了示例 1-5 中的实体扩展的 @MappedSuperclass。示例 1-5 显示了如何在实体子类中使用 @AssociationOverride
覆盖 @MappedSuperclass Employee
中定义(默认情况下)的 @JoinColumn 以便关联到 Address
。
如果使用 @AssociationOverride
,则 Employee
表包含以下列:
如果不使用 @AssociationOverride
,则 Employee
表包含以下列:
示例 1-1 @MappedSuperclass
@MappedSuperclass
public class Employee {
@Id protected Integer id;
@Version protected Integer version;
@ManyToOne protected Address address;
...
}
示例 1-2 @AssociationOverride
@Entity@AssociationOverride(name="address", joinColumns=@JoinColumn(name="ADDR_ID"))public class PartTimeEmployee extends Employee { @Column(name="WAGE") protected Float hourlyWage;
...
}
@AssociationOverrides
如果需要指定多个 @AssociationOverride,则必需使用一个 @AssociationOverrides
批注指定所有关联覆盖。
表 1-5 列出了此批注的属性。有关更多详细信息,请参阅 。有关更多详细信息,请参阅 API。
示例 1-6 显示了如何使用此批注指定两个关联覆盖。
示例 1-3 @AssociationOverrides
@Entity
@AssociationOverrides({
@AssociationOverride(name="address", joinColumn=@Column(name="ADDR_ID")),
@AssociationOverride(name="id", joinColumn=@Column(name="PTID"))
})
public class PartTimeEmployee extends Employee {
@Column(name="WAGE")
protected Float hourlyWage;
...
}
@AttributeOverride
默认情况下,JPA 持续性提供程序自动假设子类继承超类中定义的持久属性及其基本映射。
如果针对实体继承的列定义不正确,请使用 @AttributeOverride
批注自定义一个从 @MappedSuperclass 或 @Embeddable 继承的基本映射以更改与字段或属性关联的 @Column。(例如,如果继承的列名与事先存在的数据模型不兼容,或者作为数据库中的列名无效)。
如果有多个要进行的 @AttributeOverride
更改,则必须使用 @AttributeOverrides。
要自定义关联映射以更改它的 @JoinColumn,请使用 @AssociationOverride。
表 1-4 列出了此批注的属性。有关更多详细信息,请参阅 。有关更多详细信息,请参阅 API。
示例 1-4 显示了示例 1-5 中的实体扩展的 @MappedSuperclass。示例 1-5 显示了如何使用实体子类中的 @AttributeOverride
覆盖 @MappedSuperclass Employee
中定义(默认情况下)的 @Column,以便基本映射到 Address
。
如果使用 @AttributeOverride
,则 Employee
表包含以下列:
-
ID
-
VERSION
-
ADDR
_STRING
-
WAGE
如果不使用 @AttributeOverride
,则 Employee
表包含以下列:
示例 1-4 @MappedSuperclass
@MappedSuperclass
public class Employee {
@Id protected Integer id;
@Version protected Integer version;
protected String address;
...
}
示例 1-5 @AttributeOverride
@Entity
@AttributeOverride(name="address", column=@Column(name="ADDR_STRING"))
public class PartTimeEmployee extends Employee {
@Column(name="WAGE")
protected Float hourlyWage;
...
}
@AttributeOverrides
如果需要指定多个 @AttributeOverride,则必需使用一个 @AttributeOverrides
批注指定所有属性覆盖。
表 1-5 列出了此批注的属性。有关更多详细信息,请参阅 。有关更多详细信息,请参阅 API。
示例 1-6 显示了如何使用此批注指定两个属性覆盖。
示例 1-6 @AttributeOverrides
@Entity
@AttributeOverrides({
@AttributeOverride(name="address", column=@Column(name="ADDR_ID")),
@AttributeOverride(name="id", column=@Column(name="PTID"))
})
public class PartTimeEmployee extends Employee {
@Column(name="WAGE")
protected Float hourlyWage;
public PartTimeEmployee() {
...
}
public Float getHourlyWage() {
...
}
public void setHourlyWage(Float wage) {
...
}
}
@Basic
默认情况下,JPA 持续性提供程序为大多数 Java 基元类型、基元类型的包装程序以及枚举自动配置一个 @Basic
映射。
使用 @Basic
批注:
表 1-6 列出了此批注的属性。有关更多详细信息,请参阅 。有关更多详细信息,请参阅 API。
示例 1-7 显示了如何使用此批注为基本映射指定获取类型 LAZY
。
示例 1-7 @Basic
@Entity
public class Employee implements Serializable {
...
@Basic(fetch=LAZY)
protected String getName() {
return name;
}
...
}
@Column
默认情况下,JPA 持续性提供程序假设每个实体的持久字段存储在其名称与持久字段的名称相匹配的数据库表列中。
使用 @Column
批注:
表 1-7 列出了此批注的属性。有关更多详细信息,请参阅 。有关更多详细信息,请参阅 API。
示例 1-8 显示了如何使用此批注使 JPA 将 empId
持久保存到辅助表 EMP_HR
中的列 EMP_NUM
。默认情况下,JPA 将 empName
持久保存到主表 Employee
中的列 empName
。
示例 1-8 @Column
@Entity
@SecondaryTable(name="EMP_HR")
public class Employee implements Serializable {
...
@Column(name="EMP_NUM", table="EMP_HR")
private Long empId;
private String empName;
...
}