JPA批注参考

@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;
}
...
}

@Column

默认情况下,JPA 持续性提供程序假设每个实体的持久字段存储在其名称与持久字段的名称相匹配的数据库表列中。

使用 @Column 批注:

  • 将持久字段与其他名称关联(如果默认列名难于处理、与事先存在的数据模型不兼容或作为数据库中的列名无效)

  • 将持久字段与辅助表中的列关联(请参阅 @SecondaryTable

  • 微调数据库中列的特征

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

表 1-7 @Column 属性

属性必需说明

columnDefinition

可选

默认值:空 String

默认情况下,JPA 使用最少量 SQL 创建一个数据库表列。

如果需要使用更多指定选项创建的列,请将 columnDefinition 设置为在针对列生成 DDL 时希望 JPA 使用的 SQL 片断。

注意:捕获批注中的 DDL 信息时,某些 JPA 持续性提供程序可以在生成数据库模式时使用此 DDL。例如,请参阅“用于 Java2DB 模式生成的 TopLink JPA 扩展”

insertable

可选

默认值true

默认情况下,JPA 持续性提供程序假设所有列始终包含在 SQL INSERT 语句中。

如果该列不应包含在这些语句中,请将 insertable 设置为 false

length

可选

默认值: 255

默认情况下,JPA 持续性提供程序假设所有列在用于保存 String 值时的最大长度为 255 个字符。

如果该列不适合于您的应用程序或数据库,请将 length 设置为适合于您的数据库列的 int 值。

name

可选

默认值:JPA 持续性提供程序假设实体的每个持久字段都存储在其名称与持久字段或属性的名称相匹配的数据库表列中。

要指定其他列名,请将 name 设置为所需的 String 列名。

nullable

可选

默认值true

默认情况下,JPA 持续性提供程序假设允许所有列包含空值。

如果不允许该列包含空值,请将 nullable 设置为 false

precision

可选

默认值: 0.

默认情况下,JPA 持续性提供程序假设所有列在用于保存十进制(精确数字)值时的精度为 0。

如果该精度不适合于您的应用程序或数据库,请将 precision 设置为相应的 int 精度。

scale

可选

默认值: 0.

默认情况下,JPA 持续性提供程序假设所有列在用于保存十进制(精确数字)值时的伸缩度为 0。

如果该伸缩度不适合于您的应用程序或数据库,请将 scale 设置为相应的 int 精度。

table

可选

默认值:JPA 持续性提供程序假设实体的所有持久字段都存储到一个其名称为实体名称的数据库表中(请参阅 @Table)。

如果该列与辅助表关联(请参阅 @SecondaryTable),请将 name 设置为相应辅助表名称的 String 名称,如示例 1-8 所示。

unique

可选

默认值false

默认情况下,JPA 持续性提供程序假设允许所有列包含重复值。

如果不允许该列包含重复值,请将 unique 设置为 true。设置为 true 时,这相当于在表级别使用 @UniqueConstraint

updatable

可选

默认值true

默认情况下,JPA 持续性提供程序假设列始终包含在 SQL UPDATE 语句中。

如果该列不应包含在这些语句中,请将 updatable 设置为 false

示例 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;
...
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yn00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值