欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

JPA 2.0 Vs Hibernate:缓存方法的差异(一)(1)

来源: javaer 分享于  点击 31095 次 点评:165

JPA 2.0 Vs Hibernate:缓存方法的差异(一)(1)


51CTO译文】JPAJava Persistence API)与Hibernate是两个管理的持久性和对象关系映射ORMobject relational mapping)的Java EE和Java SE应用的领先技术。开源的Hibernate是一个轻量级和透明的框架,简化了数据库表映射到持久化类XML文件和生成的SQL脚本运行时的ORM。而基于XML的JPA是则一个简单得多的ORM元数据注释,取代了传统的XML映射文件,使开发人员能够通过Java应用程序注解或XML描述对象关系表的映射关系,并将运行期的实体对象持久化到数据库中。51CTO编辑特别推荐专题:Hibernate应用开发教程)

EJB 3.0软件专家组在2009年11月发布了最新版本JPA 2.0JSR 317),改进了JPA 1.0版本中的一些基本功能:ORM功能、实体管理功能、查询接口和Java持久化查询语言JPQL)。

作为JPA Provider中最强大的Hibernate通过Hibernate Annotation和Hibernate EntityManager库实施JPA。Hibernate EntityManager库是JPA的完整实现,它遵循的是JPA持久化特征,而Hibernate Annotation是除了标准化的JPA部分特定于Hibernate,它遵循自由化特征。Hibernate 从3.2开始,就开始兼容JPA。Hibernate3.2获得了Sun TCK的JPA(Java Persistence API) 兼容认证。2010年3月发布的Hibernate 3.5现在已经完全兼容JPA 2.0。Hibernate Annotations、Hibernate EntityManager和Hibernate Envers已经整合为JPA 2.0项目核心的部分。

是什么让这两个不同的ORM框架兼容的呢?在这篇文章中,我们将对JPA 2.0和Hibernate的缓存方法进行一个简单的比较。首先,我们先介绍一下JPA 2.0缓存原理。

JPA 2.0缓存原理

缓存对应用程序性能和数据库访问的优化是必不可少的。通过存储所需服务请求的数据,减少访问缓存从数据库调用数据的时间。JPA 2.0支持两个级别的缓存,JPA的一级缓存L1)和JPA的二级缓存L2)。

JPA的1级缓存

一个JPA entity manager使用的持久化上下文管理的框架。在持久性方面,与各自的entity manager作为第一级缓存。在任何一个持久化对象的框架内,将一个entity manager只有一个点的对象映射到数据库中特定的实例。当另一个用户不同的持久化对象,JPA圈定持久性对象的范围,以减少访问的时间。

持久性对象可以在任何程序执行的过程中。在程序执行的过程中,当一个用户在多个持久化对象之间来回调用,程序结束后马上跳出。坚持在一个不同的持久化对象之间进行独立实体的变化,而合并操作是在entity manager使用。

下面是一个例子:

  1. @Stateless  
  2. public EmpDetailsBean implements EmpDetails {  
  3. @PersistenceContext  
  4. EntityManager entityManager;  
  5.  
  6. public Employee addEmployee(String empId, String empName, String empUni) {  
  7. Employee employee = new Employee(empId, empName, empUnit);  
  8. entityManager.persist(employee); //employee is managed entity  
  9. return employee; //employee is detached entity  
  10. }  
  11.  
  12. public Employee updateEmployee(Employee employee) {  
  13. //employee is detached entity, employee1 is managed entity  
  14. Employee employee1 = entityManager.merge(employee);  
  15. return employee;  
  16. }  
  17. }  
  18.  

扩大一下范围,在多个持久化对象之间来回调用,因此对实体集并不是脱离,他们依然管理。扩展的范围适合应用场合在用户跨越多个请求。

下面是一个扩大范围的例子:

  1. @Stateful  
  2. public EmpDetailsBean implements EmpDetails {  
  3. @PersistenceContext(type=PersistenceContextType.EXTENDED)  
  4. EntityManager entityManager;  
  5. //Cached employee  
  6. private Employee employee;  
  7.  
  8. public void addEmployee(String empId, String empName, String empUnit) {  
  9. employee = new Employee(empId, empName, empUnit);  
  10. entityManager.persist(employee); //employee is managed entity  
  11. }  
  12.  
  13. public void updateEmployee(String empUnit) {  
  14. employee.setUnit(empUnit); //employee is managed entity  
  15. }  
  16. }  
  17.  

然而,扩大使用范围,缓存的内存消耗需要进行评估,是利用缓存调用消耗少还是直接访问数据库方便。图1显示JPA 1级缓存。

Level1Cache
JPA Level 1 (L1) Cache


相关栏目:

用户点评