首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

將遺留 Hibernate 應用遷移至 OpenJPA 與 EJB 3.0(上):源碼 API 對照與基礎映射遷移

     編輯:Java 相關知識

遷移指南(上):源碼 API 對照、運行時配置、會話/事務/實體管理與繼承/關系基礎映射

遷移背景與價值

Hibernate 為非標準 ORM 方案;OpenJPA 實現 JPA 規範(Java EE 5 核心),基於標準 API 編碼可避免供應商鎖定。本文基於 Hibernate 3.0 / EJB 2.1 與 OpenJPA 0.9.7 / EJB 3.0 實戰對比。

核心類與介面對照表

Hibernate (org.hibernate)JPA (javax.persistence)說明
ConfigurationPersistence引導類,創建工廠
SessionFactoryEntityManagerFactory線程安全,應用級單例
SessionEntityManager線程不安全,請求級,CRUD 核心
TransactionEntityTransaction事務邊界管理
QueryQuery查詢執行介面

運行時配置遷移

// Hibernate
private static SessionFactory sf;
sf = new Configuration().configure("name").buildSessionFactory();

// OpenJPA
private static EntityManagerFactory emf;
emf = Persistence.createEntityManagerFactory("name"); // 查找 META-INF/persistence.xml

會話/EntityManager 管理(ThreadLocal 模式)

// Hibernate
Session s = (Session) tls.get();
if (s == null) { s = getSessionFactory().openSession(); tls.set(s); }

// OpenJPA
EntityManager em = (EntityManager) tls.get();
if (em == null) { em = getEntityManagerFactory().createEntityManager(); tls.set(em); }

事務管理遷移

// Hibernate
Transaction tx = session.beginTransaction();
tx.commit(); / tx.rollback();

// OpenJPA
EntityTransaction tx = em.getTransaction();
tx.begin();
tx.commit(); / tx.rollback();

OpenJPA 實際無需 ThreadLocal 存儲事務,可直接鏈式調用。

實體管理 API 對照

操作HibernateOpenJPA注意
持久化新對象session.save(obj)em.persist(obj)
主鍵查詢session.load(clz, id)em.find(clz, id)find 立即查詢,load 可延遲
更新分離對象session.saveOrUpdate(obj)em.merge(obj)merge 返回新托管實例,需接收返回值
刪除session.delete(obj)em.remove(obj)

EJB Session Facade 遷移範例

EJB 2.1 實現 SessionBean 介面與回調方法;EJB 3.0 僅需 @Stateless 註解,無需 Home/Component 介面與部署描述符,配置移至註解。業務邏輯結構保持不變,僅底層 API 調用替換。

繼承映射遷移

單表繼承

Hibernate:<discriminator> + <subclass>;OpenJPA:SINGLE_TABLE 策略 + <discriminator-column> + <discriminator-value>。子類無獨立表,屬性提升至基表,非空約束受限。

連接繼承

Hibernate:<joined-subclass> + <key>;OpenJPA:JOINED 策略 + <primary-key-join-column>。子類獨立表,支援非空約束,查詢需連接,最靈活。

關系映射基礎遷移

一對一(組件/嵌入對象)

Hibernate:<component> 內嵌子對象屬性至父表;OpenJPA:<embedded> + <embeddable> 實體。數據模型同為單表。

多對一

Hibernate:子類 <many-to-one> + column;OpenJPA:子實體 <many-to-one> + <join-column>。父實體定義主鍵。

一對多與多對多

詳見下篇文檔,涉及單向/雙向選擇、擁有端判定、OpenJPA 不支援單向外鍵映射等關鍵差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved