JPA 批注参考
在 JPA 之前,Java EE 应用程序将持续类表示为容器管理的实体 bean。使用 JPA,您可以将任何普通的旧式 Java 对象 (POJO) 类指定为 JPA 实体:一个应使用 JPA 持续性提供程序的服务将其非临时字段持久保存到关系数据库(在 Java EE EJB 容器的内部或在简单 Java SE应用程序中的 EJB 容器的外部)的 Java 对象。
使用 JPA 时,可以使用批注配置实体的 JPA 行为。批注是一种使用元数据修饰 Java 源代码的简单表达方法,它编译为相应的 Java 类文件,以便在运行时由 JPA 持续性提供程序解释以管理 JPA 行为。
· 批注索引 · 完整的 JPA 批注 Javadoc
按类别划分的 JPA 批注
类别 | 说明 | 批注 |
实体 | 默认情况下,JPA 持续性提供程序假设 Java 类是非持续类,并且仅当使用此批注对其进行修饰的情况下才可用于 JPA 服务。 使用此批注将普通的旧式 Java 对象 (POJO) 类指定为实体,以便可以将它用于 JPA 服务。 要将类用于 JPA 服务,必须将该类指定为 JPA 实体(使用此批注或 orm.xml 文件)。 | @Entity |
数据库模式属性 | 默认情况下,JPA 持续性提供程序假设实体名称对应于同名的数据库表,且实体的数据成员
名称对应于同名的数据库列。 使用这些批注覆盖此默认行为,并微调对象模型与数据模型之间的关系。 | @Table @SecondaryTable @SecondaryTables @Column @JoinColumn @JoinColumns @PrimaryKeyJoinColumn @PrimaryKeyJoinColumns @JoinTable @UniqueConstraint |
身份 | 默认情况下,JPA 持续性提供程序假设每个实体必须至少有一个用作主键的字段或属性。 使用这些批注指定以下项之一: · 一个 @Id · 多个 @Id 和一个 @IdClass · 一个 @EmbeddedId 还可以使用这些批注微调数据库维护实体身份的方式。 | @Id @IdClass @EmbeddedId @GeneratedValue @SequenceGenerator @TableGenerator |
直接映射 | 默认情况下,JPA 持续性提供程序为大多数 Java 基元类型、基元类型的包装程序以及 enums 自动配置一个 Basic 映射。 使用这些批注微调数据库实现这些映射的方式。 | @Basic @Enumerated @Temporal @Lob @Transient |
关系映射 | JPA 持续性提供程序要求您显式映射关系。 使用这些批注指定实体关系的类型和特征,以微调数据库实现这些关系的方式。 | @OneToOne @ManyToOne @OneToMany @ManyToMany @MapKey @OrderBy |
组合 | 默认情况下,JPA 持续性提供程序假设每个实体均映射到它自己的表。 使用这些批注覆盖其他实体拥有的此种实体行为。 | @Embeddable @Embedded @AttributeOverride @AttributeOverrides @AssociationOverride @AssociationOverrides |
继承 | 默认情况下,JPA 持续性提供程序假设所有持久字段均由一个实体类定义。 如果实体类继承了一个或多个超类中的某些或所有持续字段,则使用这些批注。 | @Inheritance @DiscriminatorColumn @DiscriminatorValue @MappedSuperclass @AssociationOverride @AssociationOverrides @AttributeOverride @AttributeOverrides |
锁定 | 默认情况下,JPA 持续性提供程序假设应用程序负责数据一致性。 使用此批注启用 JPA 管理的乐观锁定(推荐使用)。 | @Version |
生命周期回调事件 | 默认情况下,JPA 持续性提供程序处理所有持续性操作。 如果您要在实体生命周期内随时调用自定义逻辑,请使用这些批注将实体方法与 JPA 生命周期事件关联。图 1-1 演示了这些生命周期事件之间的关系。 | @PrePersist @PostPersist @PreRemove @PostRemove @PreUpdate @PostUpdate @PostLoad @EntityListeners @ExcludeDefaultListeners @ExcludeSuperclassListeners |
实体管理器 | 在使用 JPA 持续性提供程序的应用程序中,您可以使用 EntityManager 实例执行所有持续性操作(创建、读取、更新和删除)。 使用这些批注将实体与实体管理器关联并自定义实体管理器的环境。 | @PersistenceUnit @PersistenceUnits @PersistenceContext @PersistenceContexts @PersistenceProperty |
查询 | 在使用 JPA 持续性提供程序的应用程序中,可以使用实体管理器动态创建和执行查询,也可以预定义查询并在运行时按名称执行它们。 使用这些批注预定义查询并管理它们的结果集。 | @NamedQuery @NamedQueries @NamedNativeQuery @NamedNativeQueries @QueryHint @ColumnResult @EntityResult @FieldResult @SqlResultSetMapping @SqlResultSetMappings |
表 1-2 @AssociationOverride 属性
属性 | 必需 | 说明 |
joinColumns | | 要指定映射到持久属性的连接列,请将 joinColums 设置为 JoinColumn 实例的数组(请参阅 @JoinColumn)。 映射类型将与可嵌套类或映射的超类中定义的类型相同。 |
name | | 如果使用了基于属性的访问,则映射的为嵌入对象中的属性名称,如果使用了基于字段的访问,则映射的为字段名称。 |
属性 | 必需 | 说明 |
value | | 要指定两个或更多覆盖,请将 value 设置为 AssociationOverride 实例的数组(请参阅 @AssociationOverride)。 |
属性 | 必需 | 说明 |
column | | 映射到持久属性的 @Column。映射类型将与可嵌套类或映射超类中定义的类型相同。 |
name | | 如果使用了基于属性的访问,则映射的为嵌入对象中的属性名称,如果使用了基于字段的访问,则映射的为字段名称。 |
属性 | 必需 | 说明 |
value | | 要指定两个或更多属性覆盖,请将 value 设置为 AttributeOverride 实例的数组(请参阅 @AttributeOverride)。 |
属性 | 必需 | 说明 |
fetch | | 默认值:FetchType.EAGER。默认情况下,JPA 持续性提供程序使用获取类型 EAGER:这将要求持续性提供程序运行时必须迫切获取数据。如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:这将提示持续性提供程序在首次访问数据(如果可以)时应不急于获取数据。 |
optional | | 默认值:true。 默认情况下,JPA 持续性提供程序假设所有(非基元)字段和属性的值可以为空。如果这并不适合于您的应用程序,请将 optional 设置为 false。 |
属性 | 必需 | 说明 |
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。 |
属性 | 必需 | 说明 |
name | | 在原生 SQL 查询的 SELECT 语句中将 name 设置为列名的 String 等效形式。如果在 SELECT 中使用列别名(AS 语句),则将 name 设置为列别名。 |
属性 | 必需 | 说明 |
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 列名。 |
属性 | 必需 | 说明 |
value | | 将 value 设置为符合 @DiscriminatorColumn 属性 discriminatorType 和 length 的标识符值的 String 等效形式。 |
属性 | 必需 | 说明 |
name | | 默认值:JPA 持续性提供程序假设实体名称是实体类的名称。在示例 1-20 中,默认 name 为“Employee”。 如果实体类名难于处理、是一个保留字、与事先存在的数据模型不兼容或作为数据库中的表名无效,请将 name 设置为其他 String 值。 |
表 1-12 @EntityListeners 属性
属性 | 必需 | 说明 |
value | | 要为 @Entity 或 @MappedSuperclass 指定实体监听程序类的列表,请将 value 设置为实体监听程序类的 Class 数组。 |
属性 | 必需 | 说明 |
entityClass | | 将 entityClass 设置为由 SELECT 语句返回的实体的 Class。 |
discriminatorColumn | | 默认值:空 String。 默认情况下,JPA 持续性提供程序假设 SELECT 语句中不包含标识符列(请参阅 @Inheritance)。 如果在 SELECT 语句中使用标识符列,请将 discriminatorColumn 设置为所使用的 String 列名。 |
fields | | 默认值:空 FieldResult 数组。 默认情况下,JPA 持续性提供程序假设 SELECT 语句包含与返回的实体的所有字段或属性相对应的所有列,且 SELECT 语句中的列名对应于字段或属性名(未使用 AS 语句)。 如果 SELECT 语句只包含某些与返回的实体的字段或属性相对应的列,或 SELECT 语句中的列名并不对应于字段或属性名(使用了 AS 语句),请将 fields 设置为 @FieldResult 的数组,SELECT 语句中的每一列一个 @FieldResult。 |
表 1-14 @Enumerated 属性
属性 | 必需 | 说明 |
value | | 默认值:EnumType.ORDINAL。 默认情况下,JPA 持续性提供程序假设对于映射到枚举常量的属性或字段,应持久保存序数值。在示例 1-28 中,当持久保存 Employee 时,EmployeeStatus 的序数值将写入数据库。 如果需要持久保存的枚举常量的 String 值,请将 value 设置为 EnumType.STRING。 |
属性 | 必需 | 说明 |
column | | 将 column 设置为 SELECT 语句中使用的列的 String 名称。如果在 SELECT 中使用列别名(AS 语句),请将 column 设置为列别名。 |
name | | 将 name 设置为实体的字段或属性名(作为 String),该名称对应于 column 属性指定的列名。 |
属性 | 必需 | 说明 |
generator | | 默认值:JPA 持续性提供程序为它选择的主键生成器分配一个名称。 如果该名称难于处理、是一个保留字、与事先存在的数据模型不兼容或作为数据库中的主键生成器名称无效,则将 generator 设置为要使用的 String 生成器名称。 |
strategy | | 默认值:GenerationType.AUTO。 默认情况下,JPA 持续性提供程序选择最适合于基础数据库的主键生成器类型。 如果您感觉另一个生成器类型更适合于数据库或应用程序,请将 strategy 设置为所需的 GeneratorType: · IDENTITY — 指定持续性提供程序使用数据库身份列 · AUTO — 指定持续性提供程序应选择一个最适合于基础数据库的主键生成器。 · SEQUENCE — 指定持续性提供程序使用数据库序列(请参阅 @SequenceGenerator) · TABLE — 指定持续性提供程序为使用基础数据库表的实体分配主键以确保唯一性(请参阅 @TableGenerator) |
属性 | 必需 | 说明 |
value | | 要指定复合主键类,请将 value 设置为所需的 Class(请参阅 @AttributeOverride)。 |
属性 | 必需 | 说明 |
strategy | | 默认值:InheritanceType.SINGLE_TABLE。 默认情况下,JPA 持续性提供程序假设层次中的所有类均映射到一个由表的标识符列(请参阅 @DiscriminatorColumn)中的标识符值(请参阅 @DiscriminatorValue)区分的表。 如果这并不适合于应用程序,或者如果必须匹配现有的数据模型,请将 strategy 设置为所需的 InheritanceType: · SINGLE_TABLE href="#sthref28" Foot?1? — 层次中的所有类均映射到一个表。该表有一个标识符列(请参阅 @DiscriminatorColumn),它的值(请参阅 @DiscriminatorValue)标识由行表示的实例所属的特定子类。 · TABLE_PER_CLASS — 每个类均映射到单独的表。该类的所有属性(包括继承的属性)映射到该类的表列。 · JOINED — 类层次的根由一个表表示,而每个子类由单独的表表示。每个子类表只包含特定于该子类的那些字段(而非从其超类继承的字段)和主键列,这些主键列用作超类表主键的外键。 |
属性 | 必需 | 说明 |
columnDefinition | | 默认值:空 String。 JPA 使用最少量 SQL 创建一个数据库表列。 如果需要使用更多指定选项创建列,请将 columnDefinition 设置为在针对列生成 DDL 时希望 JPA 使用的 String SQL 片断。 |
insertable | | 默认值:true。 默认情况下,JPA 持续性提供程序假设它可以插入到所有表列中。 如果该列为只读,请将 insertable 设置为 false。 |
name | | 默认值:如果使用一个连接列,则 JPA 持续性提供程序假设外键列的名称是以下名称的连接: · 引用关系属性的名称 +“_”+ 被引用的主键列的名称。 · 引用实体的字段名称 +“_”+ 被引用的主键列的名称。 如果实体中没有这样的引用关系属性或字段(请参阅 @JoinTable),则连接列名称格式化为以下名称的连接:实体名称 +“_”+ 被引用的主键列的名称。 这是外键列的名称。如果连接针对“一对一”或“多对一”实体关系,则该列位于源实体的表中。如果连接针对“多对多”实体关系,则该列位于连接表(请参阅 @JoinTable)中。 如果连接列名难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的列名无效,请将 name 设置为所需的 String 列名。 |
nullable | | 默认值:true。 默认情况下,JPA 持续性提供程序假设允许所有列包含空值。 如果不允许该列包含空值,请将 nullable 设置为 false。 |
referencedColumnName | | 默认值:如果使用一个连接列,则 JPA 持续性提供程序假设在实体关系中,被引用的列名是被引用的主键列的名称。 如果在连接表(请参阅 @JoinTable)中使用,则被引用的键列位于拥有实体(如果连接是反向连接定义的一部分,则为反向实体)的实体表中。 要指定其他列名,请将 referencedColumnName 设置为所需的 String 列名。 |
table | | 默认值:JPA 持续性提供程序假设实体的所有持久字段存储到一个名称为实体类名称的数据库表中(请参阅 @Table)。 如果该列与辅助表关联(请参阅 @SecondaryTable),请将 name 设置为相应辅助表名称的 String 名称,如示例 1-8 所示。 |
unique | | 默认值:false。 默认情况下,JPA 持续性提供程序假设允许所有列包含重复值。 如果不允许该列包含重复值,请将 unique 设置为 true。 |
updatable | | 默认值:true。 默认情况下,JPA 持续性提供程序假设它可以更新所有表列。 如果该列为只读,则将 updatable 设置为 false |
属性 | 必需 | 说明 |
value | | 要指定两个或更多连接列,请将 value 设置为 JoinColumn 实例数组(请参阅 @JoinColumn)。 |
属性 | 必需 | 说明 |
catalog | | 默认值:空 String。 默认情况下,JPA 使用任何适用于数据库的默认目录。 如果默认目录不适合于应用程序,请将 catalog 设置为要使用的 String 目录名。 |
inverseJoinColumns | | 默认值:JoinColumn 的空数组。 默认情况下,JPA 持续性提供程序假设关联的被拥有方(或另一方)上有一个连接列:被拥有实体的主键列。JPA 通过连接被拥有实体的名称 +“_”+ 被引用的主键列的名称来命名该列。 如果这样的列名难于处理、是一个保留字、与预先存在的数据模型不兼容,或者如果要指定多个连接列,则将 joinColumns 设置为 JoinColumn(请参阅 @JoinColumn)的一个或多个实例。 |
joinColumns | | 默认值:JoinColumn 的空数组。 默认情况下,JPA 持续性提供程序假设:拥有实体的每个主键列都有一个连接列。该持续性提供程序通过连接拥有实体的名称+“_”+ 被引用主键列的名称来命名这些列。 如果这样的列名难于处理、是一个保留字、与预先存在的数据模型不兼容,或者如果要指定多个连接列,则将 joinColumns 设置为 JoinColumn(请参阅 @JoinColumn)的一个或多个实例。 |
name | | 默认值:JPA 持续性提供程序通过使用下划线连接关联主表(拥有方优先)的表名来命名连接表。 如果这样的连接表难于处理、是一个保留字或与预先存在的数据模型不兼容,则将 name 设置为相应的连接表名。在示例 1-45 中,JPA 使用名为 EJB_PROJ_EMP 的连接表。 |
schema | | 默认值:空 String。 默认情况下,JPA 使用任何适用于数据库的默认模式。 如果默认模式不适合于应用程序,则将 schema 设置为要使用的 String 模式名。 |
uniqueConstraints | | 默认值:UniqueConstraint 的空数组。 默认情况下,JPA 持续性提供程序假设连接表中的任何列均没有唯一约束。 如果唯一约束应用于该表中的一列或多列,则将 uniqueContraints 设置为一个或多个 UniqueConstraint 实例的数组。有关详细信息,请参阅 @UniqueConstraint。 |
属性 | 必需 | 说明 |
cascade | | 默认值:CascadeType 的空数组。 默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。 如果希望某些或所有持续性操作层叠到关联的目标,请将 cascade 设置为一个或多个 CascadeType 实例,其中包括: · ALL — 针对拥有实体执行的任何持续性操作均层叠到关联的目标。 · MERGE — 如果合并了拥有实体,则将 merge 层叠到关联的目标。 · ;PERSIST — 如果持久保存拥有实体,则将 persist 层叠到关联的目标。 · REFRESH — 如果刷新了拥有实体,则 refresh 为关联的层叠目标。 · REMOVE — 如果删除了拥有实体,则还删除关联的目标。 |
fetch | | 默认值:FetchType.EAGER。 默认情况下,JPA 持续性提供程序使用获取类型 EAGER:这将要求持续性提供程序运行时必须迫切获取数据。 如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:这将提示持续性提供程序在首次访问数据(如果可以)时应不急于获取数据。 |
mappedBy | | 默认值:如果关系是单向的,则 JPA 持续性提供程序确定拥有该关系的字段。 如果关系是双向的,则将关联的反向(非拥有)一方上的 mappedBy 属性设置为拥有该关系的字段或属性的名称(如示例 1-48 所示)。 |
targetEntity | | 默认值:使用一般参数定义的 Collection 的参数化类型。 默认情况下,如果使用通过一般参数定义的 Collection,则持续性提供程序将从被引用的对象类型推断出关联的目标实体。 如果 Collection 不使用一般参数,则必须指定作为关联目标的实体类:将关联拥有方上的 targetEntity 元素设置为作为关系目标的实体的 Class。 |
表 1-23 @ManyToOne 属性
属性 | 必需 | 说明 |
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。 |
表 1-24 @MapKey 属性
属性 | 必需 | 说明 |
name | | 默认值:默认情况下,JPA 持续性提供程序将关联实体的主键作为 Map 键,以用于映射到非复合主键或复合主键(批注为 @IdClass)的 java.util.Map 的属性或字段。 如果要将某个其他字段或属性用作 Map 键,请将 name 设置为要使用的关联实体的 String 字段或属性名。 |
表 1-25 @NamedNativeQueries 属性
属性 | 必需 | 说明 |
value | | 要指定两个或更多属性覆盖,请将 value 设置为 NamedNativeQuery 实例数组(请参阅 @NamedNativeQuery)。 |
表 1-26 @NamedNativeQuery 属性
属性 | 必需 | 说明 |
query | | 要指定查询,请将 query 设置为 SQL 查询(作为 String)。 有关原生 SQL 查询语言的详细信息,请参阅数据库文档。 |
hints | | 默认值:空 QueryHint 数组。 默认情况下,JPA 持续性提供程序假设 SQL 查询应完全按照 query 属性提供的方式执行。 要微调查询的执行,可以选择将 hints 设置为一个 QueryHint 数组(请参阅 @QueryHint)。在执行时,EntityManager 将向基础数据库传递提示。 |
name | | 要指定查询名称,请将 name 设置为所需的 String 名称。 这是您在运行时调用查询所使用的名称(请参阅示例 1-60)。 |
resultClass | | 默认值:JPA 持续性提供程序假设结果类是关联实体的 Class。 要指定结果类,请将 resultClass 设置为所需的 Class。 |
resultSetMapping | | 默认值:JPA 持续性提供程序假设原生 SQL 查询中的 SELECT 语句:返回一个类型的实体;包括与返回的实体的所有字段或属性相对应的所有列;并使用与字段或属性名称(未使用 AS 语句)相对应的列名。 要控制 JPA 持续性提供程序如何将 JDBC 结果集映射到实体字段或属性以及标量,请通过将 resultSetMapping 设置为所需的 @SqlResultSetMapping 的 String 名称来指定结果集映射。 |
表 1-27 @NamedQueries 属性
属性 | 必需 | 说明 |
value | | 要指定两个或更多属性覆盖,请将 value 设置为 NamedQuery 实例数组(请参阅 @NamedQuery)。 |
表 1-28 @NamedQuery 属性
属性 | 必需 | 说明 |
query | | 要指定查询,请将 query 设置为 JPA 查询语言(作为 String)。 有关 JPA 查询语言的详细信息,请参阅 JSR-000220 Enterprise JavaBeans v.3.0 规范的第 4 章。 |
hints | | 默认值:空 QueryHint 数组。 默认情况下,JPA 持续性提供程序假设 SQL 查询应完全按照 query 属性提供的方式执行,而不管基础数据库如何。 如果您知道基础数据库在运行时的状态,则要微调查询的执行,可以选择将 hints 设置为 QueryHint 数组(请参阅 @QueryHint)。在执行时,EntityManager 将向基础数据库传递提示。 |
name | | 要指定查询名称,请将 name 设置为查询名称(作为 String)。 这是您在运行时调用查询所使用的名称(请参阅示例 1-60)。 |
表 1-29 @OneToMany 属性
属性 | 必需 | 说明 |
cascade | | 默认值:CascadeType 的空数组。 默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。 如果希望某些或所有持续性操作层叠到关联的目标,请将 cascade 设置为一个或多个 CascadeType 实例,其中包括: · ALL - 针对拥有实体执行的任何持续性操作均层叠到关联的目标。 · MERGE - 如果合并了拥有实体,则将 merge 层叠到关联的目标。 · ;PERSIST - 如果持久保存拥有实体,则将 persist 层叠到关联的目标。 · REFRESH - 如果刷新了拥有实体,则 refresh 为关联的层叠目标。 · REMOVE - 如果删除了拥有实体,则还删除关联的目标。 |
fetch | | 默认值:FetchType.EAGER。 默认情况下,JPA 持续性提供程序使用获取类型 EAGER:它要求持续性提供程序运行时必须急性获取数据。 如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:它提示持续性提供程序在首次访问数据(如果可以)时应惰性获取数据。 |
mappedBy | | 默认值:如果关系是单向的,则该持续性提供程序确定拥有该关系的字段。 如果关系是双向的,则将关联相反(非拥有)方上的 mappedBy 元素设置为拥有此关系的字段或属性的名称(如示例 1-62 所示)。 |
targetEntity | | 默认值:使用一般参数定义的 Collection 的参数化类型。 默认情况下,如果使用通过一般参数定义的 Collection,则持续性提供程序从被引用的对象类型推断出关联的目标实体。 如果 Collection 不使用一般参数,则必须指定作为关联目标的实体类:将关联拥有方上的 targetEntity 元素设置为作为关系目标的实体的 Class。 |
表 1-30 @OneToOne 属性
属性 | 必需 | 说明 |
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 名称(如示例 1-64)所示。 |
optional | | 默认值:true。 默认情况下,JPA 持续性提供程序假设所有(非基元)字段和属性的值可以为空。 如果这并不适合于您的应用程序,请将 optional 设置为 false。 |
targetEntity | | 默认值:JPA 持续性提供程序从被引用的对象类型推断出关联的目标实体 如果持续性提供程序无法推断出目标实体的类型,则将关联的拥有方上的 targetEntity 元素设置为作为关系目标的实体的 Class。 |
表 1-31 @OrderBy 属性
属性 | 必需 | 说明 |
value | | 默认值:JPA 持续性提供程序按关联实体的主键以升序顺序检索 Collection 关联的成员。 如果要按某些其他字段或属性排序并指定了不同的排序,则将 value 设置为以下元素的逗号分隔列表:"property-or-field-name ASC|DESC”(请参阅示例 1-65)。 |
表 1-32 @PersistenceContext 属性
属性 | 必需 | 说明 |
name | | 默认值:JPA 持续性提供程序检索默认实体管理器。 如果要注入或查找特定实体管理器,请将 name 设置为要使用的实体管理器的 String 名称。 对于相关性注入,不需要 name。 对于 JNDI 查找,必须将 name 设置为要在环境引用上下文中访问实体管理器所使用的名称。 |
properties | | 默认值:JPA 持续性提供程序假设实体管理器将使用默认属性。 如果要配置包含供应商特定属性的 JPA 持续性提供程序属性(例如,请参阅“TopLink JPA Persistence.xml 文件扩展”),请将 properties 设置为 @PersistenceProperty 实例数组。 |
type | | 默认值:;PersistenceContextType.TRANSACTION。 默认情况下,JPA 持续性提供程序假设实体管理器是容器管理的,并且它们的持续性上下文的生命周期伸缩到一个事务:即,持续性上下文在事务启动时开始存在,并在事务提交时停止存在。 在以下条件下,将 type 设置为 ;PersistenceContextType.EXTENDED: · 您的持续性上下文是应用程序管理的 · 您希望扩展的持续性上下文在 EntityManager 实例从创建一直到关闭期间存在 · 您希望实体管理器在事务提交后维护对实体对象的引用 · 您希望调用 EntityManager 方法 persist、remove、merge 和 refresh,而不论事务是否处于活动状态 |
unitName | | 默认值:JPA 持续性提供程序检索默认持续性单元的默认实体管理器。 如果要注入或查找与特定持续性单元关联的实体管理器,则将 unitName 设置为所需的 String 持续性单元名称。或者,如果要指定 EntityManagerFactory 和持续性单元,则可以使用 @PersistenceUnit。 对于相关性注入,不需要 unitName。 对于 JNDI 查找,如果指定 unitName,则由 name 访问的实体管理器必须与此持续性单元关联。 |
表 1-33 @PersistenceContexts 属性
属性 | 必需 | 说明 |
value | | 要指定两个或更多持续性上下文,请将 value 设置为 ;PersistenceContext 实例数组(请参阅 @PersistenceContext)。 |
表 1-34 @PersistenceProperty 属性
属性 | 必需 | 说明 |
name | | 要指定持续性属性的名称,请将 name 设置为 String 属性名。 有关持续性属性的详细信息,请参阅 JPA 持续性提供程序文档。 |
value | | 要指定持续性属性的值,请将 value 设置为所需的 String 属性值。 有关持续性属性值的详细信息,请参阅 JPA 持续性提供程序文档。 |
表 1-35 @PersistenceUnit 属性
属性 | 必需 | 说明 |
name | | 默认值:JPA 持续性提供程序从默认 EntityManagerFactory 中获取它的 EntityManager 实例。 如果希望 JPA 持续性提供程序在注入或查找实体管理器时使用特定的 EntityManagerFactory,请将 name 设置为所需的实体管理器工厂的 String 名称。 对于相关性注入,不需要 name。 对于 JNDI 查找,必须将 name 设置为要在环境引用上下文中访问实体管理器所使用的名称。 |
unitName | | 默认值:JPA 持续性提供程序检索默认持续性单元的默认实体管理器。 如果要注入或查找与特定持续性单元关联的实体管理器,则将 unitName 设置为所需的 String 持续性单元名称。另请参阅 @PersistenceContext。 对于相关性注入,不需要 unitName。 对于 JNDI 查找,如果指定 unitName,则由 name 访问的 EntityManagerFactory 必须与此持续性单元关联。 |
表 1-35 @PersistenceUnit 属性
属性 | 必需 | 说明 |
name | | 默认值:JPA 持续性提供程序从默认 EntityManagerFactory 中获取它的 EntityManager 实例。 如果希望 JPA 持续性提供程序在注入或查找实体管理器时使用特定的 EntityManagerFactory,请将 name 设置为所需的实体管理器工厂的 String 名称。 对于相关性注入,不需要 name。 对于 JNDI 查找,必须将 name 设置为要在环境引用上下文中访问实体管理器所使用的名称。 |
unitName | | 默认值:JPA 持续性提供程序检索默认持续性单元的默认实体管理器。 如果要注入或查找与特定持续性单元关联的实体管理器,则将 unitName 设置为所需的 String 持续性单元名称。另请参阅 @PersistenceContext。 对于相关性注入,不需要 unitName。 对于 JNDI 查找,如果指定 unitName,则由 name 访问的 EntityManagerFactory 必须与此持续性单元关联。 |
表 1-36 @PersistenceUnits 属性
属性 | 必需 | 说明 |
value | | 要指定两个或更多持续性单元,请将 value 设置为 ;PersistenceUnit 实例数组(请参阅 @PersistenceUnit)。 |
表 1-37 @PrimaryKeyJoinColumn 属性
属性 | 必需 | 说明 |
columnDefinition | | 默认值:空 String。 默认情况下,JPA 使用最少量 SQL 创建一个数据库表列。 如果需要使用更多指定选项创建的列,请将 columnDefinition 设置为在生成列的 DDL 时希望 JPA 使用的 String SQL 片断。 不要将此属性与 @OneToOne 映射一起使用。 |
name | | 默认值:JPA 持续性提供程序对当前表的主键列采用以下名称之一(取决于您使用该批注的方式): · InheritanceType.JOINED(请参阅 @Inheritance):与超类的主键列同名。 · @SecondaryTable 映射:与主表的主键列同名。 · @OneToOne 映射:与引用实体的表的主键列同名。 如果该名称难于处理、是一个保留字、与事先存在的数据模型不兼容或作为数据库中的列名无效,则将 name 设置为所需的 String 列名。 |
referencedColumnName | | 默认值:JPA 持续性提供程序对连接到的表的主键列采用以下名称之一(取决于您使用该批注的方式): · InheritanceType.JOINED(请参阅 @Inheritance):与超类的主表的主键列同名。 · @SecondaryTable 映射:与主表的主键列同名。 · @OneToOne 映射:与被引用实体的表的主键列同名。 如果该名称难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的列名无效,请将 referencedColumnName 设置为所需的 String 列名。 |
表 1-38 @PrimaryKeyJoinColumns 属性
属性 | 必需 | 说明 |
value | | 要指定一个复合(多列)主键,请将 value 设置为 ;PrimaryKeyJoinColumn 实例的数组(请参阅 @PrimaryKeyJoinColumn)。 |
表 1-39 @QueryHint 属性
属性 | 必需 | 说明 |
name | | 要指定提示名称,请将 name 设置为 String 提示名称。 有关提示的详细信息,请参阅 JPA 持续性提供程序文档。 |
value | | 要指定提示的值,请将 value 设置为所需的 String 提示值。 有关提示值的详细信息,请参阅 JPA 持续性提供程序文档。 |
表 1-40 @SecondaryTable 属性
属性 | 必需 | 说明 |
姓名 | | 如果实体使用辅助表,请将 name 设置为 String 表名。 |
catalog | | 默认值:JPA 持续性提供程序使用任何适用于数据库的默认目录。 如果默认目录不适合于应用程序,请将 catalog 设置为要使用的 String 目录名。 |
pkJoinColumns | | 默认值:JPA 持续性提供程序假设实体的数据库表中的任何列均不用于主键连接。 如果对该表中的主键连接使用一个或多个列,请将 pkJoinColumns 设置为一个或多个 @PrimaryKeyJoinColumn 实例的数组。有关详细信息,请参阅 @PrimaryKeyJoinColumn。 |
schema | | 默认值:JPA 持续性提供程序使用任何适用于数据库的默认模式。 如果默认模式不适合于应用程序,请将 schema 设置为要使用的 String 模式名。 |
uniqueConstraints | | 默认值:JPA 持续性提供程序假设实体的数据库表中的任何列均没有唯一约束。 如果唯一约束应用于该表中的一列或多列,请将 uniqueContraints 设置为一个或多个 UniqueConstraint 实例的数组。有关详细信息,请参阅 @UniqueConstraint。 |
表 1-41 @SecondaryTables 属性
属性 | 必需 | 说明 |
value | | 要指定两个或更多辅助表,请将 value 设置为 SecondaryTable 实例的数组(请参阅 @SecondaryTable)。 |
表 1-42 @SequenceGenerator 属性
属性 | 必需 | 说明 |
name | | SequenceGenerator 的名称必须匹配其 startegy 设置为 SEQUENCE 的 GeneratedValue 的名称。 |
allocationSize | | 默认值: 50. 默认情况下,JPA 持续性提供程序使用的分配大小为 50。 如果此分配大小与应用程序要求或数据库性能参数不匹配,请将 allocationSize 设置为所需的 int 值。 |
initialValue | | 默认值: 0. 默认情况下,JPA 持续性提供程序假设持续性提供程序将所有主键值的起始值设置为 0。 如果这与现有数据模型不匹配,请将 initialValue 设置为所需的 int 值。 |
sequenceName | | 默认值:JPA 持续性提供程序分配它自己创建的序列名。 如果要使用事先存在或预定义的序列,请将 sequenceName 设置为所需的 String 名称。 |
表 1-43 @SqlResultSetMapping 属性
属性 | 必需 | 说明 |
name | | 将 name 设置为此 @SqlResultSetMapping 的 String 名称。 这是用于将 @SqlResultSetMapping 与原生 SQL 查询关联的名称(请参阅示例 1-84)。 |
columns | | 默认值:空 ColumnResult 数组。 默认情况下,JPA 持续性提供程序假设 SELECT 语句只返回实体。 如果 SELECT 语句返回标量值,则将 columns 设置为 ColumnResult 实例的数组,每个标量结果一个 @ColumnResult。 |
entities | | 默认值:空 EntityResult 数组。 默认情况下,JPA 持续性提供程序假设 SELECT 语句返回一个类型的实体。 如果 SELECT 语句返回多个类型的实体,请将实体设置为 EntityResult 实例的数组,每个返回的实体类型一个 @EntityResult。 |
表 1-44 @SqlResultSetMappings 属性
属性 | 必需 | 说明 |
value | | 要指定两个或更多 SQL 结果集映射,请将 value 设置为 @SqlResultSetMapping 实例的数组。 |
表 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-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-47 @Temporal 属性
属性 | 必需 | 说明 |
value | | 将 value 设置为与希望 JPA 持续性提供程序使用的数据库类型相对应的 TemporalType: · DATE - 等于 java.sql.Date · TIME - 等于 java.sql.Time · TIMESTAMP - 等于 java.sql.Timestamp |
表 1-48 @UniqueConstraint 属性
属性 | 必需 | 说明 |
columnNames | | 如果任何列均包含唯一约束,请将 columnNames 设置为 String 列名的数组。 |