JPA详解

 

2006 年 5 月 2 日,EJB 3.0 规范最终版由 JCP(Java Community Process) 正式公布,标准号为 JSR(Java Specification Request)220。EJB 3.0 规范的发布为企业应用开发者提供了一种全新的、简化的 API。制定这组 API 的目标是让开发变得更加容易,相对于以前版本的 EJB 规范,这组 API 也更加简单。Java Persistence API 是 EJB 3.0 中负责处理持久化数据管理的部分,目标是为开发者处理持久化数据库管理提供标准支持,也成为 Java EE 容器提供商必须遵守的标准。

EJB 3.0 规范由三部分组成:EJB3.0 Simplified API、EJB 核心规范(EJB Core Contracts and Requirements)和 JPA(Java Persistence API)。

Simplified API

Simplified API 部分主要规定了基于 EJB 3.0 标准开发企业应用时所需要遵守的 Bean 类和接口要求、这些 API 的使用方式以及容器支持等多方面的内容。还详细的规定了 EJB3.0 中除 Java Persistence API 部分之外的 EJB 实现所支持的注释(Annotation)。规范中还有专门章节讲解 EJB 3.0 和此前的 EJB 规范如何同时工作,以及如何将此前已经开发好的企业应用移植到 EJB 3.0 容器中。其中的 Persistence 的内容放在了 JPA 规范中。

EJB 核心规范

EJB 核心规范中首先描述了 EJB 在企业应用中的角色、EJB 规范的体系结构,确定了支持 EJB 标准的容器应该遵守的准则和要求。随后从多个角度详细的介绍了 EJB 体系中各部分的功能需求和实现要求,包括 Session Bean、消息驱动 Bean(Message-Driven Bean)、事务、安全管理、部署描述符等。其中的 Persistence 的内容放在了 JPA 规范中。由于 EJB 3.0 规范并不排斥之前的 EJB 规范,因此 EJB 2.X 和 EJB 1.X 中的内容也保留在了 EJB 核心规范中。

Java Persistence API(JPA)

EJB 2.X 和 EJB 1.X 规范中的实体 Bean(EntityBean)部分都难以使用,使持久化成为 EJB 规范的一个软肋,影响了 EJB 标准发挥更大的作用,自然而然的,JPA 成为了 EJB3.0 规范中被关注最多的部分。JPA 规范部分详细的介绍了 JPA 中实体 Bean 新的定义,并介绍了实体 Bean 支持的注释、全新的查询语言、实体管理接口、容器实现规范等内容。

JPA 标准中引入了新的实体概念,每一个实体都是一个普通的 Java 类,不需要继承任何其他的接口或者扩展某个指定类,这个 Java 类必须使用 javax.persistence.Entity 进行注释。JPA 标准中还提供了包括 javax.persistence.Tablejavax.persistence.Id 等在内的多个注释,用于完成实体和数据库之前的映射。JPA 中引入了新的查询语言 JPQL(Java Persistence Query Language),JPQL 允许开发者采用面向对象的查询语言来查找实体,这些实体持久化在关系型的数据库中,”select a from Animal a where a.name=’a’”是一个 JPQL 的例子。其中的 Animal 是一个 Java 类,而不是关系型数据库中的一个表或者视图。除了简单的查询功能之外,JPQL 中还能够支持 Group、Order 等通常只有 SQL 才能提供的高级功能。JPA 标准中还规定了在 Java EE 环境中和非 Java EE 环境中使用 JPA 时的差异,以及 Java EE 环境中容器的职责等。


 
 


JPA 体系架构

JPA 中定义一套类和接口用于实现持久化管理和对象/关系的映射,下面这张图中显示了 JPA 的主要组件以及它们之间的相互关系。


图1 JPA 主要组件和相互关系

  • EntityManagerFactory

    EntityManagerFactoryEntityManager 的工厂类,负责创建 EntityManager 对象。

  • EntityManager

    EntityManager 是 JPA 应用中使用的基本对象,通过它提供的相应方法可以管理持久化对象,也可以新建或者删除持久化对象。EntityManager 还负责创建 Query 实例。在容器外使用时,EntityManagerFactoryEntityManager 之间是一对一的关系。

  • Entity

    EntityTransaction 提供 Entity 操作时需要的事务管理,和 EntityManager 是一对一的关系。在查询操作时不需要使用 EntityTransaction,而在对象持久化、状态更新、对象删除等情况下则必须使用显式的使用 EntityTransaction 的相关方法管理事务。

  • Query

    Query 是查询实体的接口,Query 对象可以从 EntityManager 中获得。根据 EJB 3.0 规范中的描述,Query 接口需要同时支持 JPQL 和原生态 SQL 两种语法。

  • Persistence

    Persistence 是一个工具类,负责根据配置文件提供的参数创建 EntityManagerFactory 对象。

下面的代码演示了如何通过 JPA 提供的接口和 JPQL 查询语言完成实体查询和更新的例子,例子中的代码假定运行在非 Java EE 环境中。


清单 1 在非 Java EE 环境使用 JPA 接口的例子

/*2. * Persistence 类获取 EntityManagerFactory 实例; 3. * 一般 EntityManagerFactory 实例被缓存起来重复使用,4. * 避免重复创建 EntityManagerFactory 实例引起的性能影响5. */6. EntityManagerFactory factory = 7. Persistence.createEntityManagerFactory (“mysql”);8.9. // 从 EntityManagerFactory 实例 factory 中获取 EntityManager10. EntityManager em = factory.11. createEntityManager(PersistenceContextType.EXTENDED);12.13. // 实体的更新需要在事务中运行14. EntityTransaction tx = em.getTransaction ();15. tx.begin ();16.17. // 查找所有公司中的女性雇员18. Query query = em.createQuery ("select e from Employee e " 19. + " where e.sex = 'femail'");20. List results = query.getResultList ();21.22. // 给所有女性雇员增加半天假期23. for (Object res : results){ 24. Employee emp = (Employee) res; 25. emp.setHoliday (emp.getHoliday () +0.5);}26.27. // 提交事务(持久化所有更新)28. tx.commit ();29. em.close ();30. factory.close ();

下面的代码显示了在 EJB 容器中开发 JPA 应用时的接口使用情况,由于容器中的 EntityManager 是注入的,事务也是声明式的,因此在容器中完成上面的业务逻辑要简单得多。


清单 2 在容器中运行的 JPA 例子

                
1.	  /*
2.	   * 在容器中运行 JPA 应用时,EntityManager 接口的实例”em”
3.	   * 是通过 @Resource 注释注入的。事务也通常是声明式的。
4.	   */
5.	  // 查找所有公司中的女性雇员
6.	  Query query = em.createQuery ("select e from Employee e "   
7.	      + " where e.sex = 'femail'");
8.	  List results = query.getResultList ();
9.	
10.	  // 给所有女性雇员增加半天假期
11.	  for (Object res : results){    
12.	      Employee emp = (Employee) res;    
13.	      emp.setHoliday (emp.getHoliday () +0.5);}

                
1.	/*
2.	* Persistence 类获取 EntityM
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值