JPA 批注1

来源:互联网 发布:asp动态网站编程 编辑:程序博客网 时间:2024/05/18 01:57

@AssociationOverride

默认情况下,JPA 持续性提供程序自动假设子类继承超类中定义的持久属性及其关联映射。

如果继承的列定义对实体不正确(例如,如果继承的列名与已经存在的数据模型不兼容或作为数据库中的列名无效),请使用 @AssociationOverride 批注自定义从 @MappedSuperclass@Embeddable 继承的 @OneToOne@ManyToOne 映射,以更改与字段或属性关联的 @JoinColumn

如果有多个要进行的 @AssociationOverride 更改,则必须使用 @AssociationOverrides

要自定义基本映射以更改它的 @Column,请使用 @AttributeOverride

表 1-4 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-2 @AssociationOverride 属性

属性必需说明

joinColumns

必需


要指定映射到持久属性的连接列,请将 joinColums 设置为 JoinColumn 实例的数组(请参阅 @JoinColumn)。

映射类型将与可嵌套类或映射的超类中定义的类型相同。

name

必需


如果使用了基于属性的访问,则映射的为嵌入对象中的属性名称,如果使用了基于字段的访问,则映射的为字段名称。


示例 1-4 显示了示例 1-5 中的实体扩展的 @MappedSuperclass示例 1-5 显示了如何在实体子类中使用 @AssociationOverride 覆盖 @MappedSuperclass Employee 中定义(默认情况下)的 @JoinColumn 以便关联到 Address

如果使用 @AssociationOverride,则 Employee 表包含以下列:

  • ID

  • VERSION

  • ADDR_ID

  • WAGE

如果不使用 @AssociationOverride,则 Employee 表包含以下列:

  • ID

  • VERSION

  • ADDRESS

  • WAGE

示例 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-3 @AssociationOverrides 属性

属性必需说明

value

必需


要指定两个或更多覆盖,请将 value 设置为 AssociationOverride 实例的数组(请参阅 @AssociationOverride)。


示例 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 @AttributeOverride 属性

属性必需说明

column

必需


映射到持久属性的 @Column。映射类型将与可嵌套类或映射超类中定义的类型相同。

name

必需


如果使用了基于属性的访问,则映射的为嵌入对象中的属性名称,如果使用了基于字段的访问,则映射的为字段名称。


示例 1-4 显示了示例 1-5 中的实体扩展的 @MappedSuperclass示例 1-5 显示了如何使用实体子类中的 @AttributeOverride 覆盖 @MappedSuperclass Employee 中定义(默认情况下)的 @Column,以便基本映射到 Address

如果使用 @AttributeOverride,则 Employee 表包含以下列:

  • ID

  • VERSION

  • ADDR_STRING

  • WAGE

如果不使用 @AttributeOverride,则 Employee 表包含以下列:

  • ID

  • VERSION

  • ADDRESS

  • WAGE

示例 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-5 @AttributeOverrides 属性

属性必需说明

value

必需


要指定两个或更多属性覆盖,请将 value 设置为 AttributeOverride 实例的数组(请参阅 @AttributeOverride)。


示例 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 批注:

  • 将获取类型配置为 LAZY

  • 如果空值不适合于应用程序,则将映射配置为禁止空值(针对非基元类型)

表 1-6 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-6 @Basic 属性

属性必需说明

fetch

可选


默认值FetchType.EAGER

默认情况下,JPA 持续性提供程序使用获取类型 EAGER:这将要求持续性提供程序运行时必须迫切获取数据。

如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:这将提示持续性提供程序在首次访问数据(如果可以)时应不急于获取数据。

optional

可选


默认值true

默认情况下,JPA 持续性提供程序假设所有(非基元)字段和属性的值可以为空。

如果这并不适合于您的应用程序,请将 optional 设置为 false


示例 1-7 显示了如何使用此批注为基本映射指定获取类型 LAZY

示例 1-7 @Basic

@Entity
public class Employee implements Serializable {
...
@Basic(fetch=LAZY)
protected String getName() {
return name;
}
...
}