要将 Java 类指定为 JPA 实体,请使用 @Entity 批注,如下所示:
@Entity
public class Employee implements Serializable {
}
默认情况下,JPA 持续性提供程序假设实体的所有持久字段均存储到一个名称为实体名称的数据库表中。
在以下条件下,使用 @Table 批注指定与实体关联的主表:
实体名称难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的表名无效
需要控制表所属的目录或模式
如果希望 JPA 将某些字段持久保存到主表,而将其他字段持久保存到一个或多个辅助表。
属性 | 说明 |
catalog | 默认值:JPA 持续性提供程序使用任何适用于数据库的默认目录。 如果默认目录不适合于应用程序,请将 catalog 设置为要使用的 String 目录名。 |
name | 默认值:JPA 持续性提供程序假设实体的数据库表与实体类同名。默认 name 为 Employee。 如果实体类名难以处理、是一个保留字或与预先存在的数据模型不兼容,请将 name 设置为相应的数据表名称。中,JPA 将实体类 Employee 持久保存到名为 EMP 的数据库表中。 |
schema | 默认值:JPA 持续性提供程序使用任何适用于数据库的默认模式。 如果默认模式不适合于应用程序,请将 schema 设置为要使用的 String 模式名。 |
uniqueConstraints | 默认值:JPA 持续性提供程序假设实体的数据库表中的任何列均没有唯一约束。 如果唯一约束应用于该表中的一列或多列,请将uniqueContraints 设置为一个或多个 UniqueConstraint 实例的数组。有关详细信息。 |
显示了如何使用此批注指定主表名。
@Entity
@Table(name="EMP")
public class Employee implements Serializable {
}
默认情况下,JPA 持续性提供程序管理为实体主键提供的唯一标识符。
如果要微调此机制以实现以下目的,请使用 @GeneratedValue 批注:
如果您感觉另一个生成器类型更适合于数据库或应用,则覆盖持续性提供程序为数据库选择的身份值生成的类型
如果此名称难于处理、是一个保留字、与事先存在的数据模型不兼容或作为数据库中的主键生成器名称无效,则覆盖持续性提供程序选择的主键生成器名称
属性 | 说明 |
generator | 默认值:JPA 持续性提供程序为它选择的主键生成器分配一个名称。 如果该名称难于处理、是一个保留字、与事先存在的数据模型不兼容或作为数据库中的主键生成器名称无效,则将 generator设置为要使用的 String 生成器名称。 |
strategy | 默认值:GenerationType.AUTO。 默认情况下,JPA 持续性提供程序选择最适合于基础数据库的主键生成器类型。 如果您感觉另一个生成器类型更适合于数据库或应用程序,请将 strategy 设置为所需的 GeneratorType: IDENTITY — 指定持续性提供程序使用数据库身份列 AUTO — 指定持续性提供程序应选择一个最适合于基础数据库的主键生成器。 SEQUENCE — 指定持续性提供程序使用数据库序列TABLE — 指定持续性提供程序为使用基础数据库表的实体分配主键以确保唯一性 |
显示了如何使用此批注指示持续性提供程序使用名为 CUST_SEQ、类型为GeneratorType.SEQUENCE 的主键生成器。
@Entity
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ")
@Column(name="CUST_ID")
public Long getId() {
return id;
}
使用 @Id 批注将一个或多个持久字段或属性指定为实体的主键。
对于每个实体,必须至少指定以下项之一:
一个 @Id
多个 @Id 和一个 @IdClass(对于复合主键)
一个 @EmbeddedId
默认情况下,JPA 持续性提供程序选择最合适的主键生成器并负责管理主键值:您不必采取任何进一步的操作。如果要使用 JPA 持续性提供程序的默认键生成机制,则不必采取任何进一步的操作。
显示了如何使用此批注将持久字段 empID 指定为 Employee 表的主键。
@Entity
public class Employee implements Serializable {
@Id
private int empID;
默认情况下,JPA 为具有多对多多重性的为多值关联自动定义一个@ManyToMany 映射。
使用 @ManyToMany 批注:
将获取类型配置为 LAZY
如果空值不适合于应用程序,则将映射配置为禁止空值(针对非基元类型)
由于所使用的 Collection 不是使用一般参数定义的,因此配置关联的目标实体
配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标
配置由持续性提供程序使用的连接表的详细信息
属性 | 说明 |
cascade | 默认值:CascadeType 的空数组。 默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。 如果希望某些或所有持续性操作层叠到关联的目标,请将cascade 设置为一个或多个 CascadeType 实例,其中包括: ALL — 针对拥有实体执行的任何持续性操作均层叠到关联的目标。 MERGE — 如果合并了拥有实体,则将 merge 层叠到关联的目标。 PERSIST — 如果持久保存拥有实体,则将 persist 层叠到关联的目标。 REFRESH — 如果刷新了拥有实体,则 refresh 为关联的层叠目标。 REMOVE — 如果删除了拥有实体,则还删除关联的目标。 |
fetch | 默认值:FetchType.EAGER。 默认情况下,JPA 持续性提供程序使用获取类型 EAGER:这将要求持续性提供程序运行时必须迫切获取数据。 如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:这将提示持续性提供程序在首次访问数据(如果可以)时应不急于获取数据。 |
mappedBy | 默认值:如果关系是单向的,则 JPA 持续性提供程序确定拥有该关系的字段。 如果关系是双向的,则将关联的反向(非拥有)一方上的mappedBy 属性设置为拥有该关系的字段或属性的名称。 |
targetEntity | 默认值:使用一般参数定义的 Collection 的参数化类型。 默认情况下,如果使用通过一般参数定义的 Collection,则持续性提供程序将从被引用的对象类型推断出关联的目标实体。 如果 Collection 不使用一般参数,则必须指定作为关联目标的实体类:将关联拥有方上的 targetEntity 元素设置为作为关系目标的实体的 Class。 |
显示了如何使用此批注在使用一般参数的 Customer 和 PhoneNumber 之间配置一个多对多映射。
@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;
}
@ManyToMany — 使用一般参数的 PhoneNumber 类
@Entity
public class PhoneNumber implements Serializable {
@ManyToMany(mappedBy="phones")
public Set<Customer> getCustomers() {
return customers;
}
默认情况下,JPA 为指向具有多对一多重性的其他实体类的单值关联自动定义一个 ManyToOne 映射。
使用 @ManyToOne 批注:
将获取类型配置为 LAZY
如果空值不适合于应用程序,则将映射配置为禁止空值(针对非基元类型)
配置关联的目标实体(如果无法从被引用的对象类型推断出它)
配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标
属性 | 说明 |
cascade | 默认值:CascadeType 的空数组。 默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。 如果希望某些或所有持续性操作层叠到关联的目标,请将cascade 设置为一个或多个 CascadeType 实例,其中包括: ALL — 针对拥有实体执行的任何持续性操作均层叠到关联的目标。 MERGE — 如果合并了拥有实体,则将 merge 层叠到关联的目标。 PERSIST — 如果持久保存拥有实体,则将 persist 层叠到关联的目标。 REFRESH — 如果刷新了拥有实体,则 refresh 为关联的层叠目标。 REMOVE — 如果删除了拥有实体,则还删除关联的目标。 |
fetch | 默认值:FetchType.EAGER。 默认情况下,JPA 持续性提供程序使用获取类型 EAGER:这将要求持续性提供程序运行时必须迫切获取数据。 如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:这将提示持续性提供程序在首次访问数据(如果可以)时应不急于获取数据。 |
optional | 默认值:true。 默认情况下,JPA 持续性提供程序假设所有(非基元)字段和属性的值可以为空。 如果这并不适合于您的应用程序,请将 optional 设置为false。 |
targetEntity | 默认值:JPA 持续性提供程序从被引用的对象类型推断出关联的目标实体 如果持续性提供程序无法推断出目标实体的类型,则将关联拥有方上的 targetEntity 元素设置为作为关系目标的实体的Class。 |
显示了如何使用此批注在使用一般参数的 Customer(被拥有方)和 Order(拥有方)之间配置一个多对一映射。
@Entity
public class Order implements Serializable {
@ManyToOne(optional=false)
@JoinColumn(name="CUST_ID", nullable=false, updatable=false)
public Customer getCustomer() {
return customer;
}
默认情况下,JPA 为具有一对多多重性的多值关联定义一个OneToMany 映射。
使用 @OneToMany 批注:
将获取类型配置为 LAZY
由于所使用的 Collection 不是使用一般参数定义的,因此配置关联的目标实体
配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标
配置持续性提供程序对单向一对多关系使用的连接表(请参阅 @JoinTable)的详细信息
属性 | 说明 |
cascade | 默认值:CascadeType 的空数组。 默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。 如果希望某些或所有持续性操作层叠到关联的目标,请将cascade 设置为一个或多个 CascadeType 实例,其中包括: ALL - 针对拥有实体执行的任何持续性操作均层叠到关联的目标。 MERGE - 如果合并了拥有实体,则将 merge 层叠到关联的目标。 PERSIST - 如果持久保存拥有实体,则将 persist 层叠到关联的目标。 REFRESH - 如果刷新了拥有实体,则 refresh 为关联的层叠目标。 REMOVE - 如果删除了拥有实体,则还删除关联的目标。 |
fetch | 默认值:FetchType.EAGER。 默认情况下,JPA 持续性提供程序使用获取类型 EAGER:它要求持续性提供程序运行时必须急性获取数据。 如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:它提示持续性提供程序在首次访问数据(如果可以)时应惰性获取数据。 |
mappedBy | 默认值:如果关系是单向的,则该持续性提供程序确定拥有该关系的字段。 如果关系是双向的,则将关联相反(非拥有)方上的mappedBy 元素设置为拥有此关系的字段或属性的名称。 |
targetEntity | 默认值:使用一般参数定义的 Collection 的参数化类型。 默认情况下,如果使用通过一般参数定义的 Collection,则持续性提供程序从被引用的对象类型推断出关联的目标实体。 如果 Collection 不使用一般参数,则必须指定作为关联目标的实体类:将关联拥有方上的 targetEntity 元素设置为作为关系目标的实体的 Class。 |
显示了如何使用此批注在使用一般参数的 Customer(被拥有方)和 Order(拥有方)之间配置一个一对多映射。
@OneToMany - 使用一般参数的 Customer 类
@Entity
public class Customer implements Serializable {
@OneToMany(cascade=ALL, mappedBy="customer")
public Set<Order> getOrders() {
return orders;
}
@Entity
public class Customer implements Serializable {
@ManyToOne
@JoinColumn(name="CUST_ID", nullable=false)
public Customer getCustomer() {
return customer;
}
默认情况下,JPA 为指向另一个具有一对一多重性的实体的单值关联定义一个 OneToOne 映射,并从被引用的对象类型推断出关联的目标实体。
使用 @OneToOne 批注:
将获取类型配置为 LAZY
如果空值不适合于应用程序,则将映射配置为禁止空值(针对非基元类型)
配置关联的目标实体(如果无法从被引用的对象类型推断出它)
配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标
属性 | 说明 |
cascade | 默认值:空 CascadeType 数组。 默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。 如果希望某些或所有持续性操作层叠到关联的目标,请将cascade 设置为一个或多个 CascadeType 实例,其中包括: ALL - 针对拥有实体执行的任何持续性操作均层叠到关联的目标。 MERGE - 如果合并了拥有实体,则将 merge 层叠到关联的目标。 PERSIST - 如果持久保存拥有实体,则将 persist 层叠到关联的目标。 REFRESH - 如果刷新了拥有实体,则 refresh 为关联的层叠目标。 REMOVE - 如果删除了拥有实体,则还删除关联的目标。 |
fetch | 默认值:FetchType.EAGER。 默认情况下,JPA 持续性提供程序使用获取类型 EAGER:它要求持续性提供程序运行时必须急性获取数据。 如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:它提示持续性提供程序在首次访问数据(如果可以)时应惰性获取数据。 |
mappedBy | 默认值:JPA 持续性提供程序从被引用的对象类型推断出关联的目标实体 如果持续性提供程序无法推断关联的目标实体,则将关联的相反(非拥有)方上的 mappedBy 元素设置为拥有此关系的字段或属性的 String 名称。 |
optional | 默认值:true。 默认情况下,JPA 持续性提供程序假设所有(非基元)字段和属性的值可以为空。 如果这并不适合于您的应用程序,请将 optional 设置为false。 |
targetEntity | 默认值:JPA 持续性提供程序从被引用的对象类型推断出关联的目标实体 如果持续性提供程序无法推断出目标实体的类型,则将关联的拥有方上的 targetEntity 元素设置为作为关系目标的实体的Class。 |
显示了如何使用此批注在 Customer(拥有方)和CustomerRecord(被拥有方)之间配置一个一对一映射。
@Entity
public class Customer implements Serializable {
@OneToOne(optional=false)
@JoinColumn(name="CUSTREC_ID", unique=true, nullable=false, updatable=false)
public CustomerRecord getCustomerRecord() {
return customerRecord;
}
@Entity
public class CustomerRecord implements Serializable {
@OneToOne(optional=false, mappedBy="customerRecord")
public Customer getCustomer() {
return customer;
}
使用 @Temporal 批注指定 JPA 持续性提供程序应只为 java.util.Date 和java.util.Calendar 类型的字段或属性持久保存的数据库类型。
属性 | 说明 |
value | 将 value 设置为与希望 JPA 持续性提供程序使用的数据库类型相对应的 TemporalType: DATE - 等于 java.sql.Date TIME - 等于 java.sql.Time TIMESTAMP - 等于 java.sql.Timestamp |
显示了如何使用此批注指定 JPA 持续性提供程序应将 java.util.Date 字段 startDate 持久保存为 DATE (java.sql.Date) 数据库类型。
@Entity
public class Employee {
@Temporal(DATE)
}
默认情况下,JPA 持续性提供程序假设实体的所有字段均为持久字段。
使用 @Transient 批注指定实体的非持久字段或属性,例如,一个在运行时使用但并非实体状态一部分的字段或属性。
JPA 持续性提供程序不会对批注为 @Transient 的属性或字段持久保存(或创建数据库模式)。
该批注可以与 @Entity、@MappedSuperclass 和 @Embeddable 一起使用。
显示了如何使用此批注将 Employee 字段currentSession 指定为非持久字段。JPA 持续性提供程序将不持久保存该字段。
@Entitypublic class Employee {
默认情况下,JPA 持续性提供程序假设每个实体的持久字段存储在其名称与持久字段的名称相匹配的数据库表列中。
使用 @Column 批注:
将持久字段与其他名称关联(如果默认列名难于处理、与事先存在的数据模型不兼容或作为数据库中的列名无效)
将持久字段与辅助表中的列关联
微调数据库中列的特征
属性 | 说明 |
columnDefinition | 默认值:空 String。 默认情况下,JPA 使用最少量 SQL 创建一个数据库表列。 如果需要使用更多指定选项创建的列,请将 columnDefinition 设置为在针对列生成 DDL 时希望 JPA 使用的 SQL 片断。 注意:捕获批注中的 DDL 信息时,某些 JPA 持续性提供程序可以在生成数据库模式时使用此 DDL。 |
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 持续性提供程序假设实体的所有持久字段都存储到一个其名称为实体名称的数据库表中。 如果该列与辅助表关联,请将 name 设置为相应辅助表名称的String 名称。 |
unique | 默认值:false。 默认情况下,JPA 持续性提供程序假设允许所有列包含重复值。 如果不允许该列包含重复值,请将 unique 设置为 true。 |
updatable | 默认值:true。 默认情况下,JPA 持续性提供程序假设列始终包含在 SQL UPDATE语句中。 如果该列不应包含在这些语句中,请将 updatable 设置为 false |
显示了如何使用此批注使 JPA 将 empId 持久保存到辅助表 EMP_HR 中的列 EMP_NUM。默认情况下,JPA 将empName 持久保存到主表 Employee 中的列 empName。
@Entity
@SecondaryTable(name="EMP_HR")
public class Employee implements Serializable {
@Column(name="EMP_NUM", table="EMP_HR")
private Long empId;
private String empName;
}
默认情况下,在实体关联中,JPA 持续性提供程序使用一个基于现有名称(如字段或属性名称)的数据库模式,以便它可以自动确定要使用的单个连接列(包含外键的列)。
在以下条件下使用 @JoinColumn 批注:
默认连接列名称难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的列名无效
您需要使用外部表中的列(非主键列)进行连接
您想要使用两个或更多连接列
您想要使用一个连接表
@JoinColumn 属性
属性 | 说明 |
columnDefinition | 默认值:空 String。 JPA 使用最少量 SQL 创建一个数据库表列。 如果需要使用更多指定选项创建列,请将 columnDefinition设置为在针对列生成 DDL 时希望 JPA 使用的 String SQL 片断。 |
insertable | 默认值:true。 默认情况下,JPA 持续性提供程序假设它可以插入到所有表列中。 如果该列为只读,请将 insertable 设置为 false。 |
name | 默认值:如果使用一个连接列,则 JPA 持续性提供程序假设外键列的名称是以下名称的连接: 引用关系属性的名称 +“_”+ 被引用的主键列的名称。 引用实体的字段名称 +“_”+ 被引用的主键列的名称。 如果实体中没有这样的引用关系属性或字段,则连接列名称格式化为以下名称的连接:实体名称 +“_”+ 被引用的主键列的名称。 这是外键列的名称。如果连接针对“一对一”或“多对一”实体关系,则该列位于源实体的表中。如果连接针对“多对多”实体关系,则该列位于连接表中。 如果连接列名难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的列名无效,请将 name 设置为所需的String 列名。 |
nullable | 默认值:true。 默认情况下,JPA 持续性提供程序假设允许所有列包含空值。 如果不允许该列包含空值,请将 nullable 设置为 false。 |
referencedColumnName | 默认值:如果使用一个连接列,则 JPA 持续性提供程序假设在实体关系中,被引用的列名是被引用的主键列的名称。 如果在连接表中使用,则被引用的键列位于拥有实体(如果连接是反向连接定义的一部分,则为反向实体)的实体表中。 要指定其他列名,请将 referencedColumnName 设置为所需的 String 列名。 |
table | 默认值:JPA 持续性提供程序假设实体的所有持久字段存储到一个名称为实体类名称的数据库表中。 如果该列与辅助表关联,请将 name 设置为相应辅助表名称的 String 名称。 |
unique | 默认值:false。 默认情况下,JPA 持续性提供程序假设允许所有列包含重复值。 如果不允许该列包含重复值,请将 unique 设置为 true。 |
updatable | 默认值:true。 默认情况下,JPA 持续性提供程序假设它可以更新所有表列。 如果该列为只读,则将 updatable 设置为 false |
显示了如何使用此批注使 JPA 将数据库表 Employee 列 ADDR_ID 用作连接列。
@Entity
public class Employee implements Serializable {
@ManyToOne
@JoinColumn(name="ADDR_ID")
public Address getAddress() {
return address;
}
默认情况下,在实体关联中,JPA 持续性提供程序假设使用一个连接列。
如果要指定两个或更多连接列(即复合主键),请使用 @JoinColumns 批注。
@JoinColumns 属性
属性 | 说明 |
value | 要指定两个或更多连接列,请将 value 设置为 JoinColumn实例数组。 |
显示了如何使用此批注指定两个连接列的名称:Employee 表中的 ADDR_ID(其中包含 Address 表列 ID 中的外键值)以及 Employee 表中的 ADDR_ZIP(其中包含 Address 表列 ZIP 中的外键值)。
@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;
}
默认情况下,JPA 持续性提供程序在映射多对多关联(或在单向的一对多关联中)的拥有方上的实体关联时使用一个连接表。连接表名称及其列名均在默认情况下指定,且 JPA 持续性提供程序假设:在关系的拥有方上的实体主表中,每个主键列有一个连接列。
如果您需要执行以下操作,请使用 @JoinTable 批注:
由于默认名称难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的表名无效而更改连接表的名称
由于默认名称难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的列名无效而更改连接表的列名称
使用特定目录或模式配置连接表
使用唯一约束配置一个或多个连接表列
每个实体使用多个连接列
@JoinTable 属性
属性 | 说明 |
catalog | 默认值:空 String。 默认情况下,JPA 使用任何适用于数据库的默认目录。 如果默认目录不适合于应用程序,请将 catalog 设置为要使用的 String 目录名。 |
inverseJoinColumns | 默认值:JoinColumn 的空数组。 默认情况下,JPA 持续性提供程序假设关联的被拥有方(或另一方)上有一个连接列:被拥有实体的主键列。JPA 通过连接被拥有实体的名称 +“_”+ 被引用的主键列的名称来命名该列。 如果这样的列名难于处理、是一个保留字、与预先存在的数据模型不兼容,或者如果要指定多个连接列,则将 joinColumns 设置为 JoinColumn的一个或多个实例。 |
joinColumns | 默认值:JoinColumn 的空数组。 默认情况下,JPA 持续性提供程序假设:拥有实体的每个主键列都有一个连接列。该持续性提供程序通过连接拥有实体的名称+“_”+ 被引用主键列的名称来命名这些列。 如果这样的列名难于处理、是一个保留字、与预先存在的数据模型不兼容,或者如果要指定多个连接列,则将 joinColumns 设置为 JoinColumn的一个或多个实例。 |
name | 默认值:JPA 持续性提供程序通过使用下划线连接关联主表(拥有方优先)的表名来命名连接表。 如果这样的连接表难于处理、是一个保留字或与预先存在的数据模型不兼容,则将 name 设置为相应的连接表名。JPA 使用名为EJB_PROJ_EMP 的连接表。 |
schema | 默认值:空 String。 默认情况下,JPA 使用任何适用于数据库的默认模式。 如果默认模式不适合于应用程序,则将 schema 设置为要使用的 String 模式名。 |
uniqueConstraints | 默认值:UniqueConstraint 的空数组。 默认情况下,JPA 持续性提供程序假设连接表中的任何列均没有唯一约束。 如果唯一约束应用于该表中的一列或多列,则将uniqueContraints 设置为一个或多个 UniqueConstraint 实例的数组。 |
显示了如何使用此批注为 Employee 与 Project 之间实体的多对多关系指定一个名为 EMP_PROJ_EMP 的连接表。连接表中有两列:EMP_ID 和 PROJ_ID。EMP_ID 列包含其主键列(被引用列)名为ID 的 Employee 表中的主键值。PROJ_ID 列包含其主键列(被引用列)也名为ID 的 Project 表中的主键值。
@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;
}