日期:2014-05-19  浏览次数:20615 次

The Java EE 6 Tutorial 第32章 JPA简介 (一) 实体
第六部分



持久化

第六部分讲述了Java持久化API (JPA),本部分主要包括下述各章:

■        第 32, “JPA简介”
■        第 33 章, “运行持久化的示例”
■        第 34 章, “Java持久化查询语言(Java Persistence Query Language)”
■        第 35 章, “使用Criteria API创建查询”
■        第 36 章, “创建及使用基于字符串的条件(Criteria)查询”
■        第 37 章, “用锁机制控制对实体数据的并发访问”
■        第 38 章, “设置二级缓存来改进JPA应用的性能”




第32章
JPA简介


JPA(Java Persistence API)为Java开发者提供了一个对象关系映射工具,来在Java应用中管理关系数据 。Java持久化由四个领域组成:

■        持久化API (Java Persistence API, JPA)
■        查询语言
■        Java持久化查询条件接口 (( Java Persistence Criteria API)
■        对象关系映射的元数据

下列内容可以在如下位置找到:

■   “实体”  on page 583
■    “实体继承” on page 595
■     “管理实体” on page 599
■     “查询实体” on page 604
■     “关于持久化的更多信息” on page 605



实体

一个实体是一个轻量级的持久化领域对象。一般来说,一个实体代表了关系数据库中的一个表,而每个实体对象对应表中的每一行。编程实体时,主要编写的就是实体类,不过实体也可以使用帮助类。

实体的持久化状态,通过持久化字段或者持久化特性(properties)来体现。这些字段或者特性(properties)使用对象关系映射注解,来将实体和实体间的关系,映射到底层数据存储的关系数据上。



实体类的要求

一个实体类必须满足如下要求:

■        类必须用javax.persistence.Entity注解
■ 类必须有public的或者protected的,无参的构造函数,类可以有其他的构造函数
■ The类必须未被定义为final.且方法或者持久化实体变量也都未被定义为final(???No methods or persistent instance variables must be declared final.)
■ If 如果一个实体实例以游离对象的形式传递(passed by value as a detached object),例如通过一个session bean的远程业务接口(remote business interface),则此类必须实现了Serializable接口
■ 实体可以继承实体或者非实体类,而且非实体类也可以继承实体类
■ Persistent instance持久化实体变量必须被定义为private, protected, 或者package-private (即默认访问权限) ,并且只可以被实体类的方法直接访问。客户端(此处client是相对host而言)必须通过访问器(accessor)或者业务方法(business method)访问实体类


实体类中的持久化字段和属性

一个实体的持久化状态可以通过实体实例的变量(variables)和属性(properties)来访问。字段或者属性必须是如下的Java语言类型:

■       Java 基本类型(primitive types)
■        java.lang.String
■        其他的serializable(可序列化)类型,包括:
■        Java基本类型的封装器 (Integer, Double之流)
■        java.math.BigInteger
■        java.math.BigDecimal
■        java.util.Date
■        java.util.Calendar
■        java.sql.Date
■        java.sql.Time
■        java.sql.TimeStamp
■        用户定义的可序列化(serializable)类型
■        byte[]
■        Byte[]
■        char[]
■        Character[]
■        枚举(Enumerated)类型



■        其他实体或者实体的集合
■        嵌入类(Embeddable classes)

实体可能使用持久字段,持久特性(properties),或者两者结合使用。如果映射注解放在实例变量上,实体就使用持久化字段。如果映射注解放在实体的getter方法上,来实现JavaBean式的特性(properties),实体就使用持久化特性(properties)。


持久化字段
如果实体类使用持久化字段,持久化运行时容器会直接访问实体类实例的变量(译注:即使用反射机制,绕过getter方法)所有未被注解为javax.persistence.Transient的字段且未使用Java关键字transien