JPA详解.docx
《JPA详解.docx》由会员分享,可在线阅读,更多相关《JPA详解.docx(92页珍藏版)》请在冰豆网上搜索。
![JPA详解.docx](https://file1.bdocx.com/fileroot1/2023-1/9/c307d25f-10bd-4707-916c-288e78a3a307/c307d25f-10bd-4707-916c-288e78a3a3071.gif)
JPA详解
@Table
默认情况下,JPA持续性提供程序假设实体的所有持久字段均存储到一个名称为实体名称的数据库表中(请参阅@Entity)。
在以下条件下,使用@Table批注指定与实体关联的主表:
∙实体名称难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的表名无效
∙需要控制表所属的目录或模式
如果希望JPA将某些字段持久保存到主表,而将其他字段持久保存到一个或多个辅助表,请参阅@SecondaryTable。
表1-45列出了此批注的属性。
有关更多详细信息,请参阅API。
表1-45@Table属性
属性
必需
说明
catalog
默认值:
JPA持续性提供程序使用任何适用于数据库的默认目录。
如果默认目录不适合于应用程序,请将catalog设置为要使用的String目录名。
name
默认值:
JPA持续性提供程序假设实体的数据库表与实体类同名。
在示例1-86中,默认name为Employee。
如果实体类名难以处理、是一个保留字或与预先存在的数据模型不兼容,请将name设置为相应的数据表名称。
在示例1-86中,JPA将实体类Employee持久保存到名为EMP的数据库表中。
schema
默认值:
JPA持续性提供程序使用任何适用于数据库的默认模式。
如果默认模式不适合于应用程序,请将schema设置为要使用的String模式名。
uniqueConstraints
默认值:
JPA持续性提供程序假设实体的数据库表中的任何列均没有唯一约束。
如果唯一约束应用于该表中的一列或多列,请将uniqueContraints设置为一个或多个UniqueConstraint实例的数组。
有关详细信息,请参阅@UniqueConstraint。
示例1-86显示了如何使用此批注指定主表名。
示例1-86@Table
@Entity
@Table(name="EMP")
publicclassEmployeeimplementsSerializable{
...
}
@TableGenerator
如果使用@GeneratedValue批注指定一个TABLE类型的主键生成器,可以使用@TableGenerator批注微调该主键生成器以:
∙由于名称难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的表名无效而更改主键生成器的表名称
∙更改分配大小以匹配应用程序要求或数据库性能参数
∙更改初始值以匹配现有的数据模型(例如,如果基于已经为其分配或保留了一组主键值的现有数据集构建)
∙使用特定目录或模式配置主键生成器的表
∙在主键生成器表的一列或多列商配置一个唯一的约束
表1-46列出了此批注的属性。
有关更多详细信息,请参阅API。
表1-46@TableGenerator属性
属性
必需
说明
name
SequenceGenerator的名称必须匹配其startegy设置为startegy的GeneratedValue的名称。
生成器名称的作用域对持续性单元是全局的(跨所有生成器类型)。
allocationSize
默认值:
50.
默认情况下,JPA持续性提供程序使用的分配大小为50。
如果此分配大小与应用程序要求或数据库性能参数不匹配,请将allocationSize设置为所需的int值。
catalog
默认值:
JPA持续性提供程序使用任何适用于数据库的默认目录。
如果默认目录不适合于应用程序,请将catalog设置为要使用的String目录名。
initialValue
默认值:
0.
默认情况下,JPA持续性提供程序将所有主键值的起始值设置为0。
如果这与现有数据模型不匹配,请将initialValue设置为所需的int值。
pkColumnName
默认值:
JPA持续性提供程序为生成器表中的主键列提供名称。
如果该名称不适合于应用程序,请将pkColumnName设置为所需的String名称。
pkColumnValue
默认值:
JPA持续性提供程序为生成器表中的主键列提供一个合适的主键值。
如果该值不适合于应用程序,请将pkColumnValue设置为所需的String值。
schema
默认值:
JPA持续性提供程序使用任何适用于数据库的默认模式。
如果默认模式不适合于应用程序,请将schema设置为要使用的String模式名。
table
默认值:
JPA持续性提供程序为存储生成的ID值的表提供了一个合适的名称。
如果默认表名不适合于应用程序,请将table设置为所需的String表名。
uniqueConstraints
默认值:
JPA持续性提供程序假设主键生成器表中的任何列均没有唯一约束。
如果唯一约束应用于该表中的一列或多列,则将uniqueContraints设置为一个或多个UniqueConstraint实例的数组。
有关详细信息,请参阅@UniqueConstraint。
valueColumnName
默认值:
JPA持续性提供程序为存储生成的ID值的列提供了一个合适的名称。
如果默认列名不适合于应用程序,请将valueColumnName设置为所需的String列名。
示例1-87显示了如何使用此批注为名为empGen的TABLE主键生成器指定分配大小。
示例1-87@TableGenerator
@Entity
publicclassEmployeeimplementsSerializable{
...
@Id
@TableGenerator(
name="empGen",
allocationSize=1
)
@GeneratedValue(strategy=TABLE,generator="empGen")
@Column(name="CUST_ID")
publicLonggetId(){
returnid;
}
...
@Temporal
使用@Temporal批注指定JPA持续性提供程序应只为java.util.Date和java.util.Calendar类型的字段或属性持久保存的数据库类型。
该批注可以与@Basic一起使用。
表1-14列出了此批注的属性。
有关更多详细信息,请参阅API。
表1-47@Temporal属性
属性
必需
说明
value
将value设置为与希望JPA持续性提供程序使用的数据库类型相对应的TemporalType:
∙DATE-等于java.sql.Date
∙TIME-等于java.sql.Time
∙TIMESTAMP-等于java.sql.Timestamp
示例1-88显示了如何使用此批注指定JPA持续性提供程序应将java.util.Date字段startDate持久保存为DATE(java.sql.Date)数据库类型。
示例1-88@Temporal
@Entity
publicclassEmployee{
...
@Temporal(DATE)protectedjava.util.DatestartDate;
...
}
@Transient
默认情况下,JPA持续性提供程序假设实体的所有字段均为持久字段。
使用@Transient批注指定实体的非持久字段或属性,例如,一个在运行时使用但并非实体状态一部分的字段或属性。
JPA持续性提供程序不会对批注为@Transient的属性或字段持久保存(或创建数据库模式)。
该批注可以与@Entity、@MappedSuperclass和@Embeddable一起使用。
该批注没有属性。
有关更多详细信息,请参阅API。
示例1-89显示了如何使用此批注将Employee字段currentSession指定为非持久字段。
JPA持续性提供程序将不持久保存该字段。
示例1-89@Transient
@EntitypublicclassEmployee{@Idintid;@TransientSessioncurrentSession;...}
@UniqueConstraint
默认情况下,JPA持续性提供程序假设所有列均可以包含重复值。
使用@UniqueConstraint批注指定将在为主表或辅助表生成的DDL中包含一个唯一约束。
或者,您可以在列级别指定唯一约束(请参阅@Column)。
表1-48列出了此批注的属性。
有关更多详细信息,请参阅API。
表1-48@UniqueConstraint属性
属性
必需
说明
columnNames
如果任何列均包含唯一约束,请将columnNames设置为String列名的数组。
示例1-90显示了如何使用此批注对主表EMP中的列EMP_ID和EMP_NAME指定一个唯一约束。
示例1-90使用唯一约束的@Table
@Entity
@Table(
name="EMP",
uniqueConstraints={@UniqueConstraint(columnNames={"EMP_ID","EMP_NAME"})}
)
publicclassEmployeeimplementsSerializable{
...
}
@Version
默认情况下,JPA持续性提供程序假设应用程序负责数据一致性。
使用@Version批注通过指定用作其乐观锁定值的实体类的版本字段或属性来启用JPA管理的乐观锁定(推荐做法)。
选择版本字段或属性时,确保:
∙每个实体只有一个版本字段或属性
∙选择一个持久保存到主表的属性或字段(请参阅@Table)
∙您的应用程序不修改版本属性或字段
此批注没有属性。
有关更多详细信息,请参阅API。
示例1-91显示了如何使用此批注将属性getVersionNum指定为乐观锁定值。
在该示例中,该属性的列名设置为OPTLOCK(请参阅@Column),而非属性的默认列名。
示例1-91@Version
@Entity
publicclassEmployeeimplementsSerializable{
...
@Version
@Column(name="OPTLOCK")
protectedintgetVersionNum(){
returnversionNum;
}
...
}
@Column
默认情况下,JPA持续性提供程序假设每个实体的持久字段存储在其名称与持久字段的名称相匹配的数据库表列中。
使用@Column批注:
∙将持久字段与其他名称关联(如果默认列名难于处理、与事先存在的数据模型不兼容或作为数据库中的列名无效)
∙将持久字段与辅助表中的列关联(请参阅@SecondaryTable)
∙微调数据库中列的特征
表1-7列出了此批注的属性。
有关更多详细信息,请参阅API。
表1-7@Column属性
属性
必需
说明
columnDefinition
默认值:
空String。
默认情况下,JPA使用最少量SQL创建一个数据库表列。
如果需要使用更多指定选项创建的列,请将columnDefinition设置为在针对列生成DDL时希望JPA使用的SQL片断。
注意:
捕获批注中的DDL信息时,某些JPA持续性提供程序可以在生成数据库模式时使用此DDL。
例如,请参阅“用于Java2DB模式生成的TopLinkJPA扩展”。
insertable
默认值:
true。
默认情况下,JPA持续性提供程序假设所有列始终包含在SQLINSERT语句中。
如果该列不应包含在这些语句中,请将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持续性提供程序假设列始终包含在SQLUPDATE语句中。
如果该列不应包含在这些语句中,请将updatable设置为false。
示例1-8显示了如何使用此批注使JPA将empId持久保存到辅助表EMP_HR中的列EMP_NUM。
默认情况下,JPA将empName持久保存到主表Employee中的列empName。
示例1-8@Column
@Entity
@SecondaryTable(name="EMP_HR")
publicclassEmployeeimplementsSerializable{
...
@Column(name="EMP_NUM",table="EMP_HR")
privateLongempId;
privateStringempName;
...
}
@ColumnResult
执行@NamedNativeQuery时,它可以返回实体(包括不同类型的实体)、标量值或实体和标量值的组合。
使用@ColumnResult批注返回标量值。
标量类型由您在@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)中。
在该示例中,结果列表将为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",column="order_item")
}
)
},
columns={
@ColumnResult(
name="item_name"
)
}
)
@Entity
publicclassOrder{
@Id
protectedintid;
protectedlongquantity;
protectedItemitem;
...
}
示例1-10Item实体
@Entity
publicclassItem{
@Id
protectedintid;
protectedStringname;
...
}
示例1-11结合使用@SqlResultSetMapping与@ColumnResult的原生查询
Queryq=entityManager.createNativeQuery(
"SELECTo.idASorder_id,"+
"o.quantityASorder_quantity,"+
"o.itemASorder_item,"+
"i.nameASitem_name,"+
"FROMOrdero,Itemi"+
"WHERE(order_quantity>25)AND(order_item=i.id)",
"OrderResults"
);
ListresultList=q.getResultList();
//ListofObjectarrays:
{[Order,"Shoes"],[Order,"Socks"],...}
@DiscriminatorColumn
默认情况下,当@Inheritance属性策略为InheritanceType.SINGLE_TABLE或JOINED时,JPA持续性提供程序将创建一个名为DTYPE的标识符列以区分继承层次中的类。
使用@DiscriminatorColumn批注:
∙指定一个标识符列名(如果数据模型中的列名不是默认列名DTYPE)。
∙指定一个适用于应用程序或事先存在的数据模型的标识符列长度
∙微调数据库中的标识符列的特征
表1-9列出了此批注的属性。
有关更多详细信息,请参阅API。
表1-9@DiscriminatorColumn属性
属性
必需
说明
columnDefinition
默认值:
空String。
默认情况下,JPA持续性提供程序使用最少量SQL创建一个数据库表列。
如果需要使用更多指定选项创建的列,请将columnDefinition设置为在针对列生成DDL时希望JPA使用的SQL片断。
discriminatorType
默认值:
DiscriminatorType.STRING。
默认情况下,JPA持续性提供程序假设标识符类型为String。
如果要使用其他类型,请将discriminatorType设置为DiscriminatorType.CHAR或DiscriminatorType.INTEGER。
您的@DiscriminatorValue必须符合此类型。
length
默认值:
31
默认情况下,JPA持续性提供程序假设标识符列在用于保存String值时的最大长度为255个字符。
如果该列不适合于您的应用程序或数据库,请将length设置为适合于您的数据库列的int值。
您的@DiscriminatorValue必须符合此长度。
name
默认值:
JPA持续性提供程序假设标识符列名为“DTYPE”。
要指定其他列名,请将name设置为所需的String列名。
示例1-12显示了如何使用此批注指定一个名为DISC、类型为STRING、长度为20的标识符列。
在本示例中,该类的@DiscriminatorValue指定为CUST。
示例1-13中的子类将它自己的@DiscriminatorValue指定为VIP。
在Customer和ValuedCustomer中,@DiscriminatorValue的值必须可以转换为由@DiscriminatorColumn属性discriminatorType指定的类型,并且必须符合@DiscriminatorColumn属性length。
示例1-12@DiscriminatorColumn和@DiscriminatorValue—根类
@Entity
@Table(name="CUST")
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name="DISC",discriminatorType=STRING,length=20)
@DiscriminatorValue(value-"CUST")
publicclassCustomer{
...
}
示例1-13@DiscriminatorValue—子类
@Entity
@DiscriminatorValue(value="VIP")
publicclassValuedCustomerextendsCustomer{
...
}
@DiscriminatorValue
默认情况下,当@Inheritance属性策略为InheritanceType.SINGLE_TABLE或JOINED时,JPA持续性提供程序使用@DiscriminatorColumn按实体名称区分继承层次中的类(请参阅@Entity)。
使用@DiscriminatorValue批注指定用于区分此继承层次中的实体的标识符值:
∙如果实体名称不适合于此应用程序
∙匹配现有的数据库模式
表1-10列出了此批注的属性。
有关更多详细信息,请参阅API。
表1-1