程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> JPA 2.0 Vs Hibernate:緩存方法的差異(一)(1)

JPA 2.0 Vs Hibernate:緩存方法的差異(一)(1)

編輯:J2EE

【51CTO譯文】JPA(Java Persistence API)與Hibernate是兩個管理的持久性和對象關系映射ORM(object 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.0(JSR 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. public Employee addEmployee(String empId, String empName, String empUni) {
  6. Employee employee = new Employee(empId, empName, empUnit);
  7. entityManager.persist(employee); //employee is managed entity
  8. return employee; //employee is detached entity
  9. }
  10. public Employee updateEmployee(Employee employee) {
  11. //employee is detached entity, employee1 is managed entity
  12. Employee employee1 = entityManager.merge(employee);
  13. return employee;
  14. }
  15. }

擴大一下范圍,在多個持久化對象之間來回調用,因此對實體集並不是脫離,他們依然管理。擴展的范圍適合應用場合在用戶跨越多個請求。

下面是一個擴大范圍的例子:

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

然而,擴大使用范圍,緩存的內存消耗需要進行評估,是利用緩存調用消耗少還是直接訪問數據庫方便。圖1顯示JPA 1級緩存。

Level1Cache
JPA Level 1 (L1) Cache

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved