JPA开发文档大全Word文档下载推荐.docx
- 文档编号:18009813
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:27
- 大小:31.16KB
JPA开发文档大全Word文档下载推荐.docx
《JPA开发文档大全Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《JPA开发文档大全Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
JPA的主要目标之一就是提供更加简单的编程模型:
在JPA框架下创建实体和创建Java类一样简单,没有任何的约束和限制,只需要使用javax.persistence.Entity进行注释;
JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。
JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
可媲美JDBC的查询能力
JPA定义了独特的JPQL(JavaPersistenceQueryLanguage),JPQL是EJBQL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUPBY、HAVING等通常只有SQL才能够提供的高级查询特性,甚至还能够支持子查询。
支持面向对象的高级特性
JPA中能够支持面向对象的高级特性,比如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。
支持内容:
JDBC
ORM
JDO
EJB3(JPA)
Java对象
No
Yes
高级OO原理
事务完整性
并发
大数据集
现有Schema
关系型和非关系型数据存储
查询
严格的标准/可移植
简单易用
表1持久化技术的优缺点
2.
JPA体系架构
JPA中定义一套类和接口用于实现持久化管理和对象/关系的映射,下面这张图中显示了JPA的主要组件以及它们之间的相互关系。
图1JPA主要组件和相互关系
∙EntityManagerFactory
EntityManagerFactory是EntityManager的工厂类,负责创建EntityManager对象。
∙EntityManager
EntityManager是JPA应用中使用的基本对象,通过它提供的相应方法可以管理持久化对象,也可以新建或者删除持久化对象。
EntityManager还负责创建Query实例。
在容器外使用时,EntityManagerFactory和EntityManager之间是一对一的关系。
∙Entity
EntityTransaction提供Entity操作时需要的事务管理,和EntityManager是一对一的关系。
在查询操作时不需要使用EntityTransaction,而在对象持久化、状态更新、对象删除等情况下则必须使用显式的使用EntityTransaction的相关方法管理事务。
∙Query
Query是查询实体的接口,Query对象可以从EntityManager中获得。
根据EJB3.0规范中的描述,Query接口需要同时支持JPQL和原生态SQL两种语法。
∙Persistence
Persistence是一个工具类,负责根据配置文件提供的参数创建EntityManagerFactory对象。
下面的代码演示了如何通过JPA提供的接口和JPQL查询语言完成实体查询和更新的例子,例子中的代码假定运行在非JavaEE环境中。
清单1在非JavaEE环境使用JPA接口的例子
EntityManagerFactoryfactory=Persistence.createEntityManagerFactory(“mysql”);
//从EntityManagerFactory实例factory中获取EntityManager
EntityManagerem=factory.createEntityManager(PersistenceContextType.EXTENDED);
//实体的更新需要在事务中运行
EntityTransactiontx=em.getTransaction();
tx.begin();
//查找所有公司中的女性雇员
Queryquery=em.createQuery("
selectefromEmployeeewheree.sex='
femail'
"
);
Listresults=query.getResultList();
//给所有女性雇员增加半天假期
for(Objectres:
results)
{
Employeeemp=(Employee)res;
emp.setHoliday(emp.getHoliday()+0.5);
}
//提交事务(持久化所有更新)
mit();
em.close();
factory.close();
下面的代码显示了在EJB容器中开发JPA应用时的接口使用情况,由于容器中的EntityManager是注入的,事务也是声明式的,因此在容器中完成上面的业务逻辑要简单得多。
清单2在容器中运行的JPA例子
/*
*在容器中运行JPA应用时,EntityManager接口的实例”em”
*是通过@Resource注释注入的。
事务也通常是声明式的。
*/
Employeeemp=(Employee)res;
emp.setHoliday(emp.getHoliday()+0.5);
3.
EntityBean
EJB3Entity可以是很简单的javabean,只要批注了@Entity或者在xml配置中作了说明,就被做一个可持久化的Entity处理。
但还是需要遵行一定的规则:
∙
Entity类必须要有一个无参数的public或者protected的Constructor。
如果在应用中需要将该Entity类分离出来在分布式环境中作为参数传递,该EntityClass需要实现java.io.Serialzable接口。
Entity类不可以是final,也不可有final的方法。
abstract类和Concrete实体类都可以作为Entity类。
Entity类中的属性变量不可以是public。
Entity类的属性必须通过getter/setter或者其他的商业方法获得。
3.1定义对Entity中属性变量的访问
在绝大部分的商业应用,开发人员都可以忽略这部分无需关心。
但如果你需要编写复杂的Entity类的话,你需要了解这个部分。
复杂的Entity类是指在Entity类的getter/setter和商业方法中包含比较复杂的业务逻辑而不是仅仅返回/符值某个属性。
在大部分的情况下,我们都建议使Entity类中setter/getter中的逻辑尽可能简单,除了必要的校验符值外,不要包含复杂的业务逻辑,例如对关联的其他Entity类进行操作。
但有些情况下,我们还是需要在Entity类的setter/getter方法中包含商业逻辑。
这时候,采用何种属性访问方式就可能会影响代码的性能甚至是逻辑正确产生影响。
EJB3持久化规范中,在默认情况下所有的属性都会自动的被持久化,除非属性变量用@Transient元数据进行了标注。
针对可持久化属性定义了两种属性访问方式(access):
FIELD和PROPERTY。
如果采用access=FIELD,EJB3Persistence运行环境直接访问对象的属性变量,而不是通过getter。
这种访问方式也不要求每个属性必须有getter/setter。
如果需要在getter中包含商业逻辑,应该采用access=FIELD的方式。
如果采用access=PROPERTY,EJB3Persistence运行环境将通过Entity类上的getter来访问对象的属性变量,这就要求每个属性变量要有getter/setter方法。
在EJB3中,默认的属性访问方式是PROPERTY。
access=PROPERTY时getter/setter的逻辑应该尽量简单。
规范中access方式还有多一层含义。
就是采用access=FIELD时,元数据应该批注在属性上。
@Id(generate=GeneratorType.NONE)
privateintid;
privateStringfoo;
/**
*Theentityclassmusthaveano-argconstructor.
*/
publicHelloEntityBean(){
}
publicintgetId(){
returnid;
}
采用access=PROPERTY(默认方式)时,元数据应该批注在对应属性变量的getter上。
privateintid;
privateStringfoo;
/**
publicHelloEntityBean(){
@Id(generate=GeneratorType.NONE)
publicintgetId(){
}
Entity类中的属性变量可以是以下数据类型:
∙原始数据类型和他们的对象类型
∙java.lang.String
∙java.math.BigInteger
∙java.math.BigDecimal
∙java.util.Date
∙java.util.Calendar
∙java.sql.Date
∙java.sql.Time
∙java.sql.Timestamp
∙byte[]
∙Byte[]
∙char[]
∙Character[]
∙enums
∙Entity类
∙嵌入实体类(embeddableclasses)
还可以是以下集合类型:
∙java.util.Collection和它的实体类
∙java.util.Set和它的实体类
∙java.util.List和它的实体类
∙java.util.Map和它的实体类
3.2主键和实体标识(PrimaryKeyandEntityIdentity)
每个Entity类都必须有一个主键。
在EJB3中定义了两种主键:
键单主键和复合主键。
简单主键必须对应Entity中的一个属性变量(InstanceVariable),而该属性对应数据库表中的一列。
使用简单主键,我们只需要用@Id元数据对一个属性变量或者她的getter方法进行批注。
当我们需要使用一个或多个属性变量(表中的一列或多列)联合起来作为主键,我们需要使用复合主键。
复合主键要求我们编写一个复合主键类(CompositePrimaryKeyClass)。
复合主键类需要符合以下一些要求:
复合主键类必须是public和具备一个没有参数的constructor
∙复合主键类的每个属性变量必须有getter/setter,如果没有,每个属性变量则必须是public或者protected
∙复合主键类必须实现java.io.serializable
∙复合主键类必须实现equals()和hashcode()方法
∙复合主键类中的主键属性变量的名字必须和对应的Entity中主键属性变量的名字相同
∙一旦主键值设定后,不要修改主键属性变量的值
复合主键的例子。
Entity类Person,它的主键属性变量是firstName和lastName。
@Id
privateStringfirstName;
@Id
privateStringlastName;
publicPerson(){
Person的复合主键类:
publicclassPersonPKimplementsjava.io.Serializable{
publicPersonPK(){
publicStringgetFirstName(){
returnfirstName;
publicvoidsetFirstName(StringfirstName){
this.firstName=firstName;
publicStringgetLastName(){
returnlastName;
publicvoidsetLastName(StringlastName){
this.lastName=lastName;
}
4.
EntityManager
对Entity进行操作的API都设计在javax.persistence.EntityManager接口上。
EntityManager,顾名思义是管理所有EJB3运行环境中的所有Entity。
EntityManager根据运行的环境不同分为容器管理的EntityManager和应用管理的EntityManager。
4.1配置和获得EntityManager
在J2SE环境中,EJB3定义了一个javax.persistence.Persistence类用于启动EJB3运行环境。
要获得EntityManager,首先需要通过javax.persistence.Persistence获得EntityManagerFactory,然后调用EntityManagerFactory.createEntityManager()方法获得。
//获得默认当前的EntityManagerFactory
finalEntityManagerFactoryemf=Persistence.createEntityManagerFactory();
finalEntityManagerentityManager=emf.createEntityManager();
当调用Persistence.createEntityManagerFactory()的时候,Persistence会做以下的步骤:
∙搜索当前jar包的META-INFO/persistence.xml配置文件
∙如果没有在META-INFO下找到persistence.xml,搜索当前线程的ContextClassLoader中的persistence.xml
∙根据获得的persistence.xml初始化EntityManagerFactory
4.2Entity的生命周期和状态
在EJB3中定义了四种Entity的状态:
∙新实体(new)。
Entity由应用产生,和EJB3Persistence运行环境没有联系,也没有唯一的标示符(Identity)。
∙持久化实体(managed)。
新实体和EJB3Persistence运行环境产生关联(通过persist(),merge()等方法),在EJB3Persistence运行环境中存在和被管理,标志是在EJB3Persistence运行环境中有一个唯一的标示(Identity)。
∙分离的实体(detached)。
Entity有唯一标示符,但它的标示符不被EJB3Persistence运行环境管理, 同样的该Entity也不被EJB3Persistence运行环境管理。
∙删除的实体(removed)。
Entity被remove()方法删除,对应的纪录将会在当前事务提交的时候从数据库中删除。
∙图2状态的转化
4.3持久化Entity(Persist)
finalHelloEntityBeanhello=newHelloEntityBean(1,"
foo"
);
EntityTransactiontrans=entityManager.getTransaction();
trans.begin();
//持久化hello,在此操作之前hello的状态为new
entityManager.persist(hello);
//这时hello的状态变为managed
mit();
entityManager.close();
//这时hellow的状态变为detached.
当保存一个Entity时,以该对象为根对象的整个对象图都会自动的被保存。
但在EJB3中,我们仍然可以通过关系元数据(比如OneToOne,OneToMany)的cascade属性来精确定义保存的级联行为。
下面我们来看看不同的cascade属性的区别。
不配置cascade的情况下,EJB3Persistence运行环境默认不会采用Persistencebyreachability。
publicclassFather{
intid
Stringname;
//OneToOne没有配置cascade属性,因此默认不会使用Persistencebyreachablity
@OneToOne
SonmySon
publicFather(intid,Stringname,SonmySon){
this.id=id;
this.name=name;
this.mySon=mySon;
现在来保存一个Father和Son。
finalEntityManagermanager=emf.createEntityManager();
manager.getTransaction().begin;
SonmySon=newSon();
Father=newFather(1,"
father"
mySon);
//保存Father
manager.persist(father);
//由于OneToOne关系中没有配置casacade属性,father关联的mySon不会被自动保存,需要分别保存
manager.persist(mySon);
manager.getTransaction().commit();
manager.close();
现在我们配置casacde=CascadeType
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JPA 开发 文档 大全