• 沒有找到結果。

持久化字段和属性

在文檔中 1 实体 (頁 11-14)

1  实体

1.1  实体类的要求

1.1.1  持久化字段和属性

持久化提供商运行时可以通过它的 setter/getter 方法或实例变量获得实体的 持久化状态。一个单一的获取类型(字段或属性获取)应用到实体的层级上。当 使用注解符时,在实体的持久化字段或持久化属性上的映射注解符指明获取类型 是基于字段还是基于属性:

z 如果声明实体是基于字段获取,那么持久化提供商运行时(指持久化实

现的运行环境。在 Java EE 环境中,可以是 Java EE 容器或者是第三方 持久化提供商实现)直接获取实例变量。并且持久化所有 non-transient 实例变量(没有用 Transient 标识符标识的变量)。当使用基于字段获取 式,O/R 映射注解符注解实例变量。

z 如 果 声 明 实 体 是 基 于 属 性 获 取 , 那 么 持 久 化 提 供 商 运 行 时 通 过 getter/setter 方法获取实例变量,并且持久化所有 non-transient 实例变量

(没有用 Transient 标识符标识的变量)。所有的属性获取方法必须是 public 或 protected。当使用基于属性获取,O/R 映射的注解符注解在 getter 方法上。(注解符不必应用到 setter 方法上)

z 映射注解符不能应用到那些是 transient 或 Transient 的字段或属性上。

z 如果在字段和属性都使用了映射注解符或如果在类层次内 XML 配置符 指明使用不同的获取类型,那么持久化提供商运行时的行为没有规定。

当使用持久化属性时,对持久化属性要求实体遵循 JavaBean 的读写属性的 方法约定。

在这种情况下,实体的类型 T 的每一个持久化属性 property,都有一个 getter 方法 getProperty 和一个 setter 方法 setProperty,对于 boolean 值则为 isProperty 或 者为 getter。(特殊情况下,如果 getX 是 getter 方法的名称,且 setX 是 setter 方 法的名称,那么持久化属性的名称由 java.beans.Introspector.decapitalize(X)的结果 决定)

对于单值的持久化属性,这些方法如下形式:

值是集合的持久化字段和属性必须根据下列集合值接口定义,而不管实体类 是否遵守 JavaBean 的方法规定,也不管是否使用基于字段还是基于属性获取:

java.util.Collection,java.util.List(除非使用 OrderBy 结构且列表的改变遵循指定 的顺序,否则可移植的应用不应当期望在多个持久化上下文间列表的顺序相同。

否则列表的顺序不被持久化),java.util.Set,java.util.Map(它的实现类型可以被 应用用于在实体被持久化之前实例化字段或属性;一旦实体变成受管理实体或脱

管实体,随后必须通过这个接口类型获取实体状态)。

OneToOne,ManyToOne 和 ManyToMany 注解符指定,用 XML 是等价的。参看 第 8 章)

在属性获取方法内抛出的运行时异常会引起事务回滚。当持久化运行时环境 使用这些属性获取方法加载或存储实例状态时,如果抛出应用异常,则会引起持 久化运行环境回滚事务,并且会抛出封装了应用异常的 PersitenceException。

实体的子类可以覆盖它的属性获取方法。然而,可移植的应用不需要覆盖应 用在父类持久化字段和属性上的 O/R 影射元数据。

实体类的持久化字段和属性可以是原始类型、java.lang.String、也可以是其 他 可 序 列 化 类 型 ( 包 括 原 始 类 型 的 封 装 类 型 , java.math.BigInteger , java.math.BigDecimal,java.util.Date,java.util.Calendar(注意 Calendar 类型的字 段必须被完全初始化),java.sql.Date,java.sql.Time,java.sql.Timestamp,用户自 定义类型,byte[],Byte[],char[]和 Character[])、enum、实体类型和/或实体类 型的集合、以及可嵌入类(参见 1.1.5)。

O/R 影射元数据可以用来客户化 O/R 影射、实体状态和实体间关系的加载和 存储。参见第 8 章。

在文檔中 1 实体 (頁 11-14)