關係型資料庫與物件導向模型間的「阻抗失配」困擾 Java 企業開發二十年。從序列化、JDBC、ORM、JDO、EJB 2.x 到 EJB 3.0 JPA,每一代技術都在嘗試橋接這鴻溝。JPA 以標準化註解、強大 JPQL、支援進階 OO 特性、容器級企業特性,確立了持久層開發新標竿。Apache OpenJPA 作為 JPA 開源參考實現,更提供離線傳輸、雙向映射工具、多層次快取等增強特性,成為企業級選型首選。
| 技術 | 核心缺陷 |
|---|---|
| 序列化 | 全量讀寫、無事務、無併發、無查詢、大數據不適用 |
| JDBC | SQL 散落業務代碼、手動 O/R 映射、放棄 OO 設計或自建映射層 |
| ORM (Hibernate 等) | 廠商鎖定、API 不標準、遷移成本高 |
| 對象數據庫 (ODB) | 無標準 API、廠商鎖定、放棄成熟 RDBMS、遷移成本極高、工具匱乏 |
| EJB 2.x Entity Bean | 規範過度複雜、僅支援基本映射、無繼承/多態、重量級容器、開發效率低 |
| JDO | 針對輕量級容器、缺乏容器級安全/事務/遠程支援 |
JSR 220 (2006.05) 發布 EJB 3.0,JPA 為其持久化核心,三大支柱:
Persistence:工具類,讀取配置創建 EntityManagerFactory。EntityManagerFactory:線程安全,重量級,緩存重用,創建 EntityManager。EntityManager:線程不安全,輕量級,核心操作入口 (persist/merge/remove/find/createQuery)。EntityTransaction:資源本地事務控制 (begin/commit/rollback),容器環境下由 CMT 取代。Query:JPQL/原生 SQL 查詢執行器。Entity:@Entity 註解的 POJO,持久化領域模型核心。
// Java SE 環境:手動管理一切
EntityManagerFactory emf = Persistence.createEntityManagerFactory("mysql");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Query q = em.createQuery("SELECT e FROM Employee e WHERE e.sex='female'");
List list = q.getResultList();
for (Object o : list) { Employee e=(Employee)o; e.setHoliday(e.getHoliday()+0.5); }
tx.commit();
em.close(); emf.close();
// Java EE 容器環境:注入與聲明式事務
@PersistenceContext EntityManager em; // 注入
// 無需事務代碼,由容器 CMT 管理
Query q = em.createQuery("SELECT e FROM Employee e WHERE e.sex='female'");
for (Object o : q.getResultList()) { ((Employee)o).setHoliday(...); }
// 方法結束自動提交
MappingTool → DDL/建表。ReverseMappingTool → 實體+註解。MappingTool 校驗一致性。JPA 以標準化、簡單性、強大功能終結了持久層框架百家爭鳴的混亂。OpenJPA 完整實現 JPA 並提供企業級增強,是開源陣營最成熟選擇之一。本系列後續將深入實戰:環境搭建、實體映射、繼承關聯、主鍵策略、生命週期回調、Eclipse Dali 工具、Java EE 容器部署等核心主題,助力開發者掌握現代持久化開發精髓。