转-JPA 批注参考(4)

name




默认值:JPA 持续性提供程序假设实体的所有持久字段存储到一个名称为实体类名称的数据库表中(请参阅 @Table)。
如果该列与辅助表关联(请参阅 @SecondaryTable),请将 name 设置为相应辅助表名称的 String 名称,如示例 1-8 所示。


示例 1-43 显示了如何使用此批注使 JPA 将数据库表 Employee 列 ADDR_ID 用作连接列。
示例 1-43 @JoinColumn
@Entity
public class Employee implements Serializable {
??? ...
@ManyToOne
@JoinColumn(name="ADDR_ID")
public Address getAddress() {
return address;
??? }
}
@JoinColumns
默认情况下,在实体关联中,JPA 持续性提供程序假设使用一个连接列。
如果要指定两个或更多连接列(即复合主键),请使用 @JoinColumns 批注。
表 1-20 列出了此批注的属性。有关更多详细信息,请参阅 API。
表 1-20 @JoinColumns 属性
?
属性
必需
说明
value
要指定两个或更多连接列,请将 value 设置为 JoinColumn 实例数组(请参阅 @JoinColumn)。
示例 1-44 显示了如何使用此批注指定两个连接列的名称:Employee 表中的 ADDR_ID(其中包含 Address 表列 ID 中的外键值)以及 Employee 表中的 ADDR_ZIP(其中包含 Address 表列 ZIP 中的外键值)。
示例 1-44 @JoinColumns
@Entity
public class Employee implements Serializable {
??? ...
@ManyToOne
@JoinColumns({
@JoinColumn(name="ADDR_ID", referencedColumnName="ID"),
@JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP")
??? })
public Address getAddress() {
return address;
??? }
??? ...
}
@JoinTable
默认情况下,JPA 持续性提供程序在映射多对多关联(或在单向的一对多关联中)的拥有方上的实体关联时使用一个连接表。连接表名称及其列名均在默认情况下指定,且 JPA 持续性提供程序假设:在关系的拥有方上的实体主表中,每个主键列有一个连接列。
如果您需要执行以下操作,请使用 @JoinTable 批注:
● 由于默认名称难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的表名无效而更改连接表的名称
● 由于默认名称难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的列名无效而更改连接表的列名称
● 使用特定目录或模式配置连接表
● 使用唯一约束配置一个或多个连接表列
● 每个实体使用多个连接列
表 1-21 列出了此批注的属性。有关更多详细信息,请参阅 API。
表 1-21 @JoinTable 属性
?
属性
必需
说明
catalog





示例 1-45 显示了如何使用此批注为 Employee 与 Project 之间实体的多对多关系指定一个名为 EMP_PROJ_EMP 的连接表。连接表中有两列:EMP_ID 和 PROJ_ID。EMP_ID 列包含其主键列(被引用列)名为 ID 的 Employee 表中的主键值。PROJ_ID 列包含其主键列(被引用列)也名为 ID 的 Project 表中的主键值。
示例 1-45 @JoinTable
@Entity
public class Employee implements Serializable {
??? ...
@ManyToMany
@JoinTable(
name="EJB_PROJ_EMP",
joinColumns=@JoinColumn(name="EMP_ID", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="PROJ_ID", referencedColumnName="ID")
??? )
public Collection getProjects() {
return projects;
??? }
??? ...
}
@Lob
默认情况下,JPA 持续性提供程序假设所有持久数据均可以表示为典型的数据库数据类型。
结合使用 @Lob 批注与 @Basic 映射,以指定持久属性或字段应作为大型对象持久保存到数据库支持的大型对象类型。
Lob 可以是二进制类型或字符类型。持续性提供程序从持久字段或属性的类型推断出 Lob 类型。
对于基于字符串和字符的类型,默认值为 Clob。在所有其他情况下,默认值为 Blob。
还可以使用 @Column 属性 columnDefinition 进一步改进 Lob 类型。
此批注没有属性。有关更多详细信息,请参阅 API。
示例 1-46 显示了如何使用此批注指定持久字段 pic 应作为 Blob 进行持久保存。
示例 1-46 @Lob
@Entity
public class Employee implements Serializable {
??? ...
@Lob
@Basic(fetch=LAZY)
@Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
protected byte[] pic;
??? ...
}
@ManyToMany
默认情况下,JPA 为具有多对多多重性的为多值关联自动定义一个 @ManyToMany 映射。
使用 @ManyToMany 批注:
● 将获取类型配置为 LAZY
● 如果空值不适合于应用程序,则将映射配置为禁止空值(针对非基元类型)
● 由于所使用的 Collection 不是使用一般参数定义的,因此配置关联的目标实体
● 配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标
● 配置由持续性提供程序使用的连接表的详细信息(请参阅 @JoinTable)
表 1-22 列出了此批注的属性。有关更多详细信息,请参阅 API。
表 1-22 @ManyToMany 属性
?
属性
必需
说明
cascade



示例 1-47 和示例 1-48 显示了如何使用此批注在使用一般参数的 Customer 和 PhoneNumber 之间配置一个多对多映射。
示例 1-47 @ManyToMany — 使用一般参数的 Customer 类
@Entity
public class Customer implements Serializable {
??? ...
@ManyToMany
@JoinTable(
name="CUST_PHONE",
joinColumns=
@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
inverseJoinColumns=
@JoinColumn(name="PHONE_ID", referencedColumnName="ID")
??? )
public Set<PhoneNumber> getPhones() {
return phones;
??? }
??? ...
}
示例 1-48 @ManyToMany — 使用一般参数的 PhoneNumber 类
@Entity
public class PhoneNumber implements Serializable {
??? ...
@ManyToMany(mappedBy="phones")
public Set<Customer> getCustomers() {
return customers;
??? }
??? ...
}
@ManyToOne
默认情况下,JPA 为指向具有多对一多重性的其他实体类的单值关联自动定义一个 ManyToOne 映射。
使用 @ManyToOne 批注:
● 将获取类型配置为 LAZY
● 如果空值不适合于应用程序,则将映射配置为禁止空值(针对非基元类型)
● 配置关联的目标实体(如果无法从被引用的对象类型推断出它)
● 配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标
表 1-23 列出了此批注的属性。有关更多详细信息,请参阅 API。
表 1-23 @ManyToOne 属性
?
属性
必需
说明
cascade



示例 1-49 显示了如何使用此批注在使用一般参数的 Customer(被拥有方)和 Order(拥有方)之间配置一个多对一映射。
示例 1-49 @ManyToOne
@Entity
public class Order implements Serializable {
??? ...
@ManyToOne(optional=false)
@JoinColumn(name="CUST_ID", nullable=false, updatable=false)
public Customer getCustomer() {
return customer;
??? }
??? ...
}