1、JPA详解Table默认情况下,JPA 持续性提供程序假设实体的所有持久字段均存储到一个名称为实体名称的数据库表中(请参阅 Entity)。在以下条件下,使用 Table 批注指定与实体关联的主表: 实体名称难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的表名无效 需要控制表所属的目录或模式如果希望 JPA 将某些字段持久保存到主表,而将其他字段持久保存到一个或多个辅助表,请参阅 SecondaryTable。表 1-45 列出了此批注的属性。有关更多详细信息,请参阅 API。表 1-45 Table 属性属性必需说明catalog默认值:JPA 持续性提供程序使用任何适用于
2、数据库的默认目录。如果默认目录不适合于应用程序,请将 catalog 设置为要使用的 String 目录名。name默认值:JPA 持续性提供程序假设实体的数据库表与实体类同名。在示例 1-86 中,默认 name 为 Employee。如果实体类名难以处理、是一个保留字或与预先存在的数据模型不兼容,请将 name 设置为相应的数据表名称。在示例 1-86 中,JPA 将实体类 Employee 持久保存到名为 EMP 的数据库表中。schema默认值:JPA 持续性提供程序使用任何适用于数据库的默认模式。如果默认模式不适合于应用程序,请将 schema 设置为要使用的 String 模式名。
3、uniqueConstraints默认值:JPA 持续性提供程序假设实体的数据库表中的任何列均没有唯一约束。如果唯一约束应用于该表中的一列或多列,请将 uniqueContraints 设置为一个或多个 UniqueConstraint 实例的数组。有关详细信息,请参阅 UniqueConstraint。示例 1-86 显示了如何使用此批注指定主表名。示例 1-86 TableEntityTable(name=EMP)public class Employee implements Serializable .TableGenerator如果使用 GeneratedValue 批注指定一个 T
4、ABLE 类型的主键生成器,可以使用 TableGenerator 批注微调该主键生成器以: 由于名称难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的表名无效而更改主键生成器的表名称 更改分配大小以匹配应用程序要求或数据库性能参数 更改初始值以匹配现有的数据模型(例如,如果基于已经为其分配或保留了一组主键值的现有数据集构建) 使用特定目录或模式配置主键生成器的表 在主键生成器表的一列或多列商配置一个唯一的约束表 1-46 列出了此批注的属性。有关更多详细信息,请参阅 API。表 1-46 TableGenerator 属性属性必需说明nameSequenceGenerator
5、 的名称必须匹配其 startegy 设置为 startegy 的 GeneratedValue 的名称。生成器名称的作用域对持续性单元是全局的(跨所有生成器类型)。allocationSize默认值: 50.默认情况下,JPA 持续性提供程序使用的分配大小为 50。如果此分配大小与应用程序要求或数据库性能参数不匹配,请将 allocationSize 设置为所需的 int 值。catalog默认值:JPA 持续性提供程序使用任何适用于数据库的默认目录。如果默认目录不适合于应用程序,请将 catalog 设置为要使用的 String 目录名。initialValue默认值: 0.默认情况下,J
6、PA 持续性提供程序将所有主键值的起始值设置为 0。如果这与现有数据模型不匹配,请将 initialValue 设置为所需的 int 值。pkColumnName默认值:JPA 持续性提供程序为生成器表中的主键列提供名称。如果该名称不适合于应用程序,请将 pkColumnName 设置为所需的 String 名称。pkColumnValue默认值:JPA 持续性提供程序为生成器表中的主键列提供一个合适的主键值。如果该值不适合于应用程序,请将 pkColumnValue 设置为所需的 String 值。schema默认值:JPA 持续性提供程序使用任何适用于数据库的默认模式。如果默认模式不适合于
7、应用程序,请将 schema 设置为要使用的 String 模式名。table默认值:JPA 持续性提供程序为存储生成的 ID 值的表提供了一个合适的名称。如果默认表名不适合于应用程序,请将 table 设置为所需的 String 表名。uniqueConstraints默认值:JPA 持续性提供程序假设主键生成器表中的任何列均没有唯一约束。如果唯一约束应用于该表中的一列或多列,则将 uniqueContraints 设置为一个或多个 UniqueConstraint 实例的数组。有关详细信息,请参阅 UniqueConstraint。valueColumnName默认值:JPA 持续性提供程
8、序为存储生成的 ID 值的列提供了一个合适的名称。如果默认列名不适合于应用程序,请将 valueColumnName 设置为所需的 String 列名。示例 1-87 显示了如何使用此批注为名为 empGen 的 TABLE 主键生成器指定分配大小。示例 1-87 TableGeneratorEntitypublic class Employee implements Serializable .IdTableGenerator(name=empGen,allocationSize=1 )GeneratedValue(strategy=TABLE, generator=empGen)Colum
9、n(name=CUST_ID)public Long getId() return id; .Temporal使用 Temporal 批注指定 JPA 持续性提供程序应只为 java.util.Date 和 java.util.Calendar 类型的字段或属性持久保存的数据库类型。该批注可以与 Basic 一起使用。表 1-14 列出了此批注的属性。有关更多详细信息,请参阅 API。表 1-47 Temporal 属性属性必需说明value将 value 设置为与希望 JPA 持续性提供程序使用的数据库类型相对应的 TemporalType: DATE - 等于 java.sql.Date
10、TIME - 等于 java.sql.Time TIMESTAMP - 等于 java.sql.Timestamp示例 1-88 显示了如何使用此批注指定 JPA 持续性提供程序应将 java.util.Date 字段 startDate 持久保存为 DATE (java.sql.Date) 数据库类型。示例 1-88 TemporalEntitypublic class Employee .Temporal(DATE) protected java.util.Date startDate; .Transient默认情况下,JPA 持续性提供程序假设实体的所有字段均为持久字段。使用 Trans
11、ient 批注指定实体的非持久字段或属性,例如,一个在运行时使用但并非实体状态一部分的字段或属性。JPA 持续性提供程序不会对批注为 Transient 的属性或字段持久保存(或创建数据库模式)。该批注可以与 Entity、MappedSuperclass 和 Embeddable 一起使用。该批注没有属性。有关更多详细信息,请参阅 API。示例 1-89 显示了如何使用此批注将 Employee 字段 currentSession 指定为非持久字段。JPA 持续性提供程序将不持久保存该字段。示例 1-89 TransientEntitypublic class Employee Id int
12、 id; Transient Session currentSession; .UniqueConstraint默认情况下,JPA 持续性提供程序假设所有列均可以包含重复值。使用 UniqueConstraint 批注指定将在为主表或辅助表生成的 DDL 中包含一个唯一约束。或者,您可以在列级别指定唯一约束(请参阅 Column)。表 1-48 列出了此批注的属性。有关更多详细信息,请参阅 API。表 1-48 UniqueConstraint 属性属性必需说明columnNames如果任何列均包含唯一约束,请将 columnNames 设置为 String 列名的数组。示例 1-90 显示了
13、如何使用此批注对主表 EMP 中的列 EMP_ID 和 EMP_NAME 指定一个唯一约束。示例 1-90 使用唯一约束的 TableEntityTable(name=EMP,uniqueConstraints=UniqueConstraint(columnNames=EMP_ID, EMP_NAME)public class Employee implements Serializable .Version默认情况下,JPA 持续性提供程序假设应用程序负责数据一致性。使用 Version 批注通过指定用作其乐观锁定值的实体类的版本字段或属性来启用 JPA 管理的乐观锁定(推荐做法)。选择版本
14、字段或属性时,确保: 每个实体只有一个版本字段或属性 选择一个持久保存到主表的属性或字段(请参阅 Table) 您的应用程序不修改版本属性或字段此批注没有属性。有关更多详细信息,请参阅 API。示例 1-91 显示了如何使用此批注将属性 getVersionNum 指定为乐观锁定值。在该示例中,该属性的列名设置为 OPTLOCK(请参阅 Column),而非属性的默认列名。示例 1-91 VersionEntitypublic class Employee implements Serializable .VersionColumn(name=OPTLOCK)protected int get
15、VersionNum() return versionNum; .Column默认情况下,JPA 持续性提供程序假设每个实体的持久字段存储在其名称与持久字段的名称相匹配的数据库表列中。使用 Column 批注: 将持久字段与其他名称关联(如果默认列名难于处理、与事先存在的数据模型不兼容或作为数据库中的列名无效) 将持久字段与辅助表中的列关联(请参阅 SecondaryTable) 微调数据库中列的特征表 1-7 列出了此批注的属性。有关更多详细信息,请参阅 API。表 1-7 Column 属性属性必需说明columnDefinition默认值:空 String。默认情况下,JPA 使用最少量
16、 SQL 创建一个数据库表列。如果需要使用更多指定选项创建的列,请将 columnDefinition 设置为在针对列生成 DDL 时希望 JPA 使用的 SQL 片断。注意:捕获批注中的 DDL 信息时,某些 JPA 持续性提供程序可以在生成数据库模式时使用此 DDL。例如,请参阅“用于 Java2DB 模式生成的 TopLink JPA 扩展”。insertable默认值:true。默认情况下,JPA 持续性提供程序假设所有列始终包含在 SQL INSERT 语句中。如果该列不应包含在这些语句中,请将 insertable 设置为 false。length默认值: 255默认情况下,JPA
17、 持续性提供程序假设所有列在用于保存 String 值时的最大长度为 255 个字符。如果该列不适合于您的应用程序或数据库,请将 length 设置为适合于您的数据库列的 int 值。name默认值:JPA 持续性提供程序假设实体的每个持久字段都存储在其名称与持久字段或属性的名称相匹配的数据库表列中。要指定其他列名,请将 name 设置为所需的 String 列名。nullable默认值:true。默认情况下,JPA 持续性提供程序假设允许所有列包含空值。如果不允许该列包含空值,请将 nullable 设置为 false。precision默认值: 0.默认情况下,JPA 持续性提供程序假设所
18、有列在用于保存十进制(精确数字)值时的精度为 0。如果该精度不适合于您的应用程序或数据库,请将 precision 设置为相应的 int 精度。scale默认值: 0.默认情况下,JPA 持续性提供程序假设所有列在用于保存十进制(精确数字)值时的伸缩度为 0。如果该伸缩度不适合于您的应用程序或数据库,请将 scale 设置为相应的 int 精度。table默认值:JPA 持续性提供程序假设实体的所有持久字段都存储到一个其名称为实体名称的数据库表中(请参阅 Table)。如果该列与辅助表关联(请参阅 SecondaryTable),请将 name 设置为相应辅助表名称的 String 名称,如示
19、例 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 将 empNam
20、e 持久保存到主表 Employee 中的列 empName。示例 1-8 ColumnEntitySecondaryTable(name=EMP_HR)public class Employee implements Serializable .Column(name=EMP_NUM, table=EMP_HR)private Long empId;private String empName; .ColumnResult执行 NamedNativeQuery 时,它可以返回实体(包括不同类型的实体)、标量值或实体和标量值的组合。使用 ColumnResult 批注返回标量值。标量类型由您在
21、 ColumnResult 中标识的列类型确定。有关详细信息,另请参阅 EntityResult、FieldResult 和 SqlResultSetMapping。表 1-8 列出了此批注的属性。有关更多详细信息,请参阅 API。表 1-8 ColumnResult 属性属性必需说明name在原生 SQL 查询的 SELECT 语句中将 name 设置为列名的 String 等效形式。如果在 SELECT 中使用列别名(AS 语句),则将 name 设置为列别名。示例 1-9 显示了如何使用此批注将 Item(请参阅示例 1-10)标量 name 包含在结果列表(请参阅示例 1-11)中。在
22、该示例中,结果列表将为 Object 数组的 List,如:Order, Shoes, Order, Socks, .。示例 1-9 使用 ColumnResult 的 Order 实体SqlResultSetMapping(name=OrderResults,entities=EntityResult(entityClass=Order.class, fields=FieldResult(name=id, column=order_id),FieldResult(name=quantity, column=order_quantity),FieldResult(name=item, colu
23、mn=order_item) ) ,columns=ColumnResult(name=item_name ) )Entitypublic class Order Idprotected int id;protected long quantity;protected Item item; .示例 1-10 Item 实体Entitypublic class Item Idprotected int id;protected String name; .示例 1-11 结合使用 SqlResultSetMapping 与 ColumnResult 的原生查询Query q = entityMa
24、nager.createNativeQuery(SELECT o.id AS order_id, +o.quantity AS order_quantity, +o.item AS order_item, + i.name AS item_name, +FROM Order o, Item i +WHERE (order_quantity 25) AND (order_item = i.id),OrderResults);List resultList = q.getResultList(); / List of Object arrays:Order, Shoes, Order, Socks
25、, .DiscriminatorColumn默认情况下,当 Inheritance 属性策略为 InheritanceType.SINGLE_TABLE 或 JOINED 时,JPA 持续性提供程序将创建一个名为 DTYPE 的标识符列以区分继承层次中的类。使用 DiscriminatorColumn 批注: 指定一个标识符列名(如果数据模型中的列名不是默认列名 DTYPE)。 指定一个适用于应用程序或事先存在的数据模型的标识符列长度 微调数据库中的标识符列的特征表 1-9 列出了此批注的属性。有关更多详细信息,请参阅 API。表 1-9 DiscriminatorColumn 属性属性必需说
26、明columnDefinition默认值:空 String。默认情况下,JPA 持续性提供程序使用最少量 SQL 创建一个数据库表列。如果需要使用更多指定选项创建的列,请将 columnDefinition 设置为在针对列生成 DDL 时希望 JPA 使用的 SQL 片断。discriminatorType默认值:DiscriminatorType.STRING。默认情况下,JPA 持续性提供程序假设标识符类型为 String。如果要使用其他类型,请将 discriminatorType 设置为 DiscriminatorType.CHAR 或 DiscriminatorType.INTEGE
27、R。您的 DiscriminatorValue 必须符合此类型。length默认值: 31默认情况下,JPA 持续性提供程序假设标识符列在用于保存 String 值时的最大长度为 255 个字符。如果该列不适合于您的应用程序或数据库,请将 length 设置为适合于您的数据库列的 int 值。您的 DiscriminatorValue 必须符合此长度。name默认值:JPA 持续性提供程序假设标识符列名为“DTYPE”。要指定其他列名,请将 name 设置为所需的 String 列名。示例 1-12 显示了如何使用此批注指定一个名为 DISC、类型为 STRING、长度为 20 的标识符列。在
28、本示例中,该类的 DiscriminatorValue 指定为 CUST。示例 1-13 中的子类将它自己的 DiscriminatorValue 指定为 VIP。在 Customer 和 ValuedCustomer 中,DiscriminatorValue 的值必须可以转换为由 DiscriminatorColumn 属性 discriminatorType 指定的类型,并且必须符合 DiscriminatorColumn 属性 length。示例 1-12 DiscriminatorColumn 和 DiscriminatorValue 根类EntityTable(name=CUST)I
29、nheritance(strategy=SINGLE_TABLE)DiscriminatorColumn(name=DISC, discriminatorType=STRING, length=20)DiscriminatorValue(value-CUST)public class Customer . 示例 1-13 DiscriminatorValue 子类EntityDiscriminatorValue(value=VIP)public class ValuedCustomer extends Customer . DiscriminatorValue默认情况下,当 Inheritance 属性策略为 InheritanceType.SINGLE_TABLE 或 JOINED 时,JPA 持续性提供程序使用 DiscriminatorColumn 按实体名称区分继承层次中的类(请参阅 Entity)。使用 DiscriminatorValue 批注指定用于区分此继承层次中的实体的标识符值: 如果实体名称不适合于此应用程序 匹配现有的数据库模式表 1-10 列出了此批注的属性。有关更多详细信息,请参阅 API。表 1-1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1