ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:28.73KB ,
资源ID:4197547      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4197547.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(JPA开发文档大全.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

JPA开发文档大全.docx

1、JPA开发文档大全JPA开发文档(大全)这是一份比较全面的JPA文档,希望能够帮助大家,让大家更好的学习工作。1. 发展中的持久化技术1.1 JDBC很多企业应用的开发者选择使用 JDBC 管理关系型数据库中的数据。JDBC支持处理大量的数据,能够保证数据的一致性,支持信息的并发访问,提供 SQL 查询语言查找数据。JDBC 所使用的关系模型不是为保存对象而设计的,因此迫使开发者选择在处理持久数据时放弃面向对象编程,或者自己去开发将面向对象特性(比如:类之间的继承)和关系型数据库进行映射的专有解决方案。1.2 关系对象映射(Object Relational Mapping,ORM)ORM 是

2、目前完成对象和关系数据表之间的映射最好的一种技术, 这些 ORM 框架处理对象和关系数据库之间的协调工作,将开发者从这部分工作中解脱出来,集中精力处理对象模型。阻碍 ORM 发展的问题是,现有的每一种 ORM 产品都有自己特有的 API,开发者只能将自己的代码绑定到某一个框架提供商的接口上,这种状况形成了厂商锁定,意味着一旦该框架提供商无法解决系统中出现的严重错误,或者因为其它的原因转而采用其它的框架,将会给开发者的企业应用带来极大的困难,唯一的解决办法是重写所有的持久化代码。1.3 Java 数据对象(Java Data Object,JDO)JDO 是 Java EE 标准中另外一个支持管

3、理持久化数据的规范,JDO 规范使用和 JPA 非常类似的 API,只是通常是通过 JCA 技术集成到应用服务器上。但是 JDO 是针对轻量级容器而设计的,不能够支持容器级别的声明式安全、事务特性,也无法对远程方法调用提供支持。1.4 Java Persistence API(JPA)EJB 3.0 规范由三部分组成:EJB3.0 Simplified API、EJB 核心规范(EJB Core Contracts and Requirements)和 JPA(Java Persistence API)。JPA 规范部分详细的介绍了 JPA 中实体 Bean 的定义,并介绍了实体 Bean 支

4、持的注释、全新的查询语言、实体管理接口、容器实现规范等内容。JPA 标准制定过程中充分吸收了目前已经出现的所有持久化技术的所有优点,摒弃了它们存在的局限,使 JPA 在简单易用、查询能力等方面表现突出。标准化JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于 JPA 开发的企业应用能够经过少量的修改就能够在不同的 JPA 框架下运行。对容器级特性的支持JPA 框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。简单易用,集成方便JPA

5、的主要目标之一就是提供更加简单的编程模型:在 JPA 框架下创建实体和创建 Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity 进行注释;JPA 的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA 基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。可媲美 JDBC 的查询能力JPA 定义了独特的 JPQL(Java Persistence Query Language),JPQL 是 EJB QL 的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持

6、批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。支持面向对象的高级特性JPA 中能够支持面向对象的高级特性,比如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。支持内容:JDBCORMJDOEJB 3(JPA)Java 对象NoYesYesYes高级OO原理NoYesYesYes事务完整性YesYesYesYes并发YesYesYesYes大数据集YesYesYesYes现有 SchemaYesYesYesYes关系型

7、和非关系型数据存储NoNoYesNo查询YesYesYesYes严格的标准/可移植NoNoYesYes简单易用YesYesYesYes表 1 持久化技术的优缺点2. JPA 体系架构JPA 中定义一套类和接口用于实现持久化管理和对象/关系的映射,下面这张图中显示了 JPA 的主要组件以及它们之间的相互关系。图1 JPA 主要组件和相互关系EntityManagerFactory EntityManagerFactory 是 EntityManager 的工厂类,负责创建 EntityManager 对象。EntityManager EntityManager 是 JPA 应用中使用的基本对象,

8、通过它提供的相应方法可以管理持久化对象,也可以新建或者删除持久化对象。EntityManager 还负责创建 Query 实例。在容器外使用时,EntityManagerFactory 和 EntityManager 之间是一对一的关系。Entity EntityTransaction 提供 Entity 操作时需要的事务管理,和 EntityManager 是一对一的关系。在查询操作时不需要使用 EntityTransaction,而在对象持久化、状态更新、对象删除等情况下则必须使用显式的使用 EntityTransaction 的相关方法管理事务。Query Query 是查询实体的接口,

9、Query 对象可以从 EntityManager 中获得。根据 EJB 3.0 规范中的描述,Query 接口需要同时支持 JPQL 和原生态 SQL 两种语法。Persistence Persistence 是一个工具类,负责根据配置文件提供的参数创建 EntityManagerFactory 对象。下面的代码演示了如何通过 JPA 提供的接口和 JPQL 查询语言完成实体查询和更新的例子,例子中的代码假定运行在非 Java EE 环境中。清单 1 在非 Java EE 环境使用 JPA 接口的例子EntityManagerFactory factory = Persistence.cre

10、ateEntityManagerFactory (“mysql”); / 从 EntityManagerFactory 实例 factory 中获取 EntityManagerEntityManager em = factory.createEntityManager(PersistenceContextType.EXTENDED);/ 实体的更新需要在事务中运行EntityTransaction tx = em.getTransaction ();tx.begin (); / 查找所有公司中的女性雇员Query query = em.createQuery (select e from Em

11、ployee e where e.sex = femail);List results = query.getResultList (); / 给所有女性雇员增加半天假期for (Object res : results) Employee emp = (Employee) res; emp.setHoliday (emp.getHoliday () +0.5); / 提交事务(持久化所有更新)mit ();em.close ();factory.close ();下面的代码显示了在 EJB 容器中开发 JPA 应用时的接口使用情况,由于容器中的 EntityManager 是注入的,事务也是

12、声明式的,因此在容器中完成上面的业务逻辑要简单得多。清单 2 在容器中运行的 JPA 例子/* 在容器中运行 JPA 应用时,EntityManager 接口的实例”em”* 是通过 Resource 注释注入的。事务也通常是声明式的。*/ 查找所有公司中的女性雇员Query query = em.createQuery (select e from Employee e where e.sex = femail);List results = query.getResultList ();/ 给所有女性雇员增加半天假期for (Object res : results) Employee e

13、mp = (Employee) res; emp.setHoliday (emp.getHoliday () +0.5);3. Entity BeanEJB3 Entity可以是很简单的java bean,只要批注了Entity或者在xml配置中作了说明,就被做一个可持久化的Entity处理。 但还是需要遵行一定的规则: Entity类必须要有一个无参数的public或者protected的Constructor。 如果在应用中需要将该Entity类分离出来在分布式环境中作为参数传递,该Entity Class需要实现java.io.Serialzable接口。 Entity类不可以是fina

14、l,也不可有final的方法。 abstract类和Concrete实体类都可以作为Entity类。 Entity类中的属性变量不可以是public。Entity类的属性必须通过getter/setter或者其他的商业方法获得。3.1定义对Entity中属性变量的访问在绝大部分的商业应用,开发人员都可以忽略这部分无需关心。但如果你需要编写复杂的Entity类的话,你需要了解这个部分。复杂的Entity类是指在Entity类的getter/setter和商业方法中包含比较复杂的业务逻辑而不是仅仅返回/符值某个属性。在大部分的情况下,我们都建议使Entity类中setter/getter中的逻辑尽

15、可能简单,除了必要的校验符值外,不要包含复杂的业务逻辑,例如对关联的其他Entity类进行操作。但有些情况下,我们还是需要在Entity类的setter/getter方法中包含商业逻辑。这时候,采用何种属性访问方式就可能会影响代码的性能甚至是逻辑正确产生影响。EJB3持久化规范中,在默认情况下所有的属性都会自动的被持久化,除非属性变量用Transient元数据进行了标注。针对可持久化属性定义了两种属性访问方式(access): FIELD和PROPERTY。 如果采用access=FIELD, EJB3 Persistence运行环境直接访问对象的属性变量,而不是通过getter。这种访问方式

16、也不要求每个属性必须有getter/setter。如果需要在getter中包含商业逻辑,应该采用access=FIELD的方式。 如果采用access=PROPERTY, EJB3 Persistence运行环境将通过Entity类上的getter来访问对象的属性变量,这就要求每个属性变量要有getter/setter方法。在EJB3中,默认的属性访问方式是PROPERTY。access=PROPERTY时getter/setter的逻辑应该尽量简单。 规范中access方式还有多一层含义。就是采用access=FIELD时,元数据应该批注在属性上。 Id(generate=Generator

17、Type.NONE) private int id; private String foo; /* * The entity class must have a no-arg constructor. */ public HelloEntityBean() public int getId() return id; 采用access=PROPERTY(默认方式)时,元数据应该批注在对应属性变量的getter上。 private int id;private String foo;/* * The entity class must have a no-arg constructor.*/pub

18、lic HelloEntityBean() Id(generate=GeneratorType.NONE)public int getId() return id; 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类

19、嵌入实体类(embeddable classes) 还可以是以下集合类型:java.util.Collection和它的实体类 java.util.Set和它的实体类 java.util.List和它的实体类 java.util.Map和它的实体类 3.2 主键和实体标识(Primary Key and Entity Identity)每个Entity类都必须有一个主键。在EJB3中定义了两种主键:键单主键和复合主键。 简单主键必须对应Entity中的一个属性变量(Instance Variable),而该属性对应数据库表中的一列。使用简单主键,我们只需要用Id元数据对一个属性变量或者她的ge

20、tter方法进行批注。当我们需要使用一个或多个属性变量(表中的一列或多列)联合起来作为主键,我们需要使用复合主键。复合主键要求我们编写一个复合主键类( Composite Primary Key Class )。复合主键类需要符合以下一些要求: 复合主键类必须是public和具备一个没有参数的constructor 复合主键类的每个属性变量必须有getter/setter,如果没有,每个属性变量则必须是public或者protected 复合主键类必须实现java.io.serializable 复合主键类必须实现equals()和hashcode()方法 复合主键类中的主键属性变量的名字必须

21、和对应的Entity中主键属性变量的名字相同 一旦主键值设定后,不要修改主键属性变量的值 复合主键的例子。Entity类Person,它的主键属性变量是firstName和lastName。 Id private String firstName; Id private String lastName; public Person() Person的复合主键类: public class PersonPK implements java.io.Serializable private String firstName; private String lastName; public Perso

22、nPK() public String getFirstName() return firstName; public void setFirstName(String firstName) this.firstName = firstName; public String getLastName() return lastName; public void setLastName(String lastName) this.lastName = lastName; 4. EntityManager对Entity进行操作的API都设计在javax.persistence.EntityManag

23、er接口上。EntityManager,顾名思义是管理所有EJB 3运行环境中的所有Entity。 EntityManager根据运行的环境不同分为容器管理的EntityManager和应用管理的EntityManager。 4.1 配置和获得EntityManager在J2SE环境中,EJB3定义了一个javax.persistence.Persistence类用于启动EJB3运行环境。要获得EntityManager,首先需要通过javax.persistence.Persistence获得EntityManagerFactory,然后调用EntityManagerFactory.crea

24、teEntityManager()方法获得。 / 获得默认当前的EntityManagerFactory final EntityManagerFactory emf = Persistence.createEntityManagerFactory(); final EntityManager entityManager = emf.createEntityManager(); 当调用Persistence.createEntityManagerFactory()的时候,Persistence会做以下的步骤:搜索当前jar包的META-INFO/persistence.xml配置文件 如果没有

25、在META-INFO下找到persistence.xml,搜索当前线程的ContextClassLoader中的persistence.xml 根据获得的persistence.xml初始化EntityManagerFactory 4.2 Entity的生命周期和状态在EJB3中定义了四种Entity的状态: 新实体(new)。Entity由应用产生,和EJB3 Persistence运行环境没有联系,也没有唯一的标示符(Identity)。 持久化实体(managed)。新实体和EJB3 Persistence运行环境产生关联(通过persist(), merge()等方法),在EJB3 P

26、ersistence运行环境中存在和被管理,标志是在EJB3 Persistence运行环境中有一个唯一的标示(Identity)。 分离的实体(detached)。Entity有唯一标示符,但它的标示符不被EJB3 Persistence运行环境管理,同样的该Entity也不被EJB3 Persistence运行环境管理。 删除的实体(removed)。Entity被remove()方法删除,对应的纪录将会在当前事务提交的时候从数据库中删除。 图2 状态的转化 4.3 持久化Entity(Persist) final EntityManagerFactory emf = Persistenc

27、e.createEntityManagerFactory(); final EntityManager entityManager = emf.createEntityManager(); final HelloEntityBean hello = new HelloEntityBean( 1, foo ); EntityTransaction trans = entityManager.getTransaction(); trans.begin(); / 持久化hello,在此操作之前hello的状态为new entityManager.persist( hello ); / 这时hello

28、的状态变为managed mit(); entityManager.close(); / 这时hellow的状态变为detached. 当保存一个Entity时,以该对象为根对象的整个对象图都会自动的被保存。但在EJB3中,我们仍然可以通过关系元数据(比如OneToOne,OneToMany)的cascade属性来精确定义保存的级联行为。 下面我们来看看不同的cascade属性的区别。 不配置cascade的情况下,EJB3 Persistence运行环境默认不会采用Persistence by reachability。 public class Father Id int id Strin

29、g name; / OneToOne没有配置cascade属性,因此默认不会使用Persistence by reachablity OneToOne Son mySon public Father( int id, String name, Son mySon ) this.id = id; this.name = name; this.mySon = mySon; 现在来保存一个Father和Son。 final EntityManager manager = emf.createEntityManager(); manager.getTransaction().begin; Son mySon = new Son(); Father = new Father( 1, father mySon ); / 保存Father manager.persist( father ); / 由于OneToOne关系中没有配置casacade属性,father 关联的mySon不会被自动保存,需要分别保存 manager.persist( mySon ); manager.getTransaction().commit(); manager.close(); 现在我们配置casacde=CascadeType.ALL public class Father Id

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1