本系列前幾篇著重於 OpenJPA 在獨立 Java SE 環境下的應用,本文將深入實戰,示範如何在 JBoss 應用伺服器上部署 OpenJPA,開發實體 Bean、封裝 Session Bean、並透過 Local 接口實現客戶端訪問。
將 OpenJPA 遷移至 Java EE 容器,需完成三大關鍵轉型:
entityManager.getTransaction().begin()),改用容器管理的 JTA 資料源(JNDI 綁定)與容器管理事務(CMT)。EntityManagerFactory,改用 @PersistenceContext 或 @PersistenceUnit 註解注入 EntityManager 或 EntityManagerFactory,或透過 JNDI 查找。EJB 3.0 規範規定實體無法直接綁定到 JNDI 供遠程客戶端訪問,必須透過 Session Bean 封裝。本例定義 Remote(IAnimalDAO)與 Local(ILocalAnimalDAO)雙介面,實現類 AnimalDAO 同時實現兩者,並以 @Stateless 聲明無狀態 Session Bean,@PersistenceContext 注入 EntityManager:
@Stateless
public class AnimalDAO implements IAnimalDAO, ILocalAnimalDAO {
@PersistenceContext
EntityManager em;
public void persistAnimal(Animal animal) {
em.persist(animal); // 事務由容器 JTA 自動管理,無需 begin/commit
}
}
mysql-ds.xml)將 MySQL 驅動 JAR 放入 $JBOSS_HOME/server/default/lib,在 deploy 目錄建立 mysql-ds.xml,定義 JNDI 名稱 java:/mysqlDS,配置連線池參數。
persistence.xml)關鍵在於指定 provider 為 org.apache.openjpa.persistence.PersistenceProviderImpl,否則 JBoss 預設使用 Hibernate。並透過 <jta-data-source>java:/mysqlDS</jta-data-source> 引用容器資料源:
<persistence-unit name="ejb3">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<jta-data-source>java:/mysqlDS</jta-data-source>
<class>org.vivianj.jpademo.beans.Animal</class>
</persistence-unit>
將 openjpa-*.jar、commons-*.jar、serp-*.jar 複製至 $JBOSS_HOME/server/default/lib,確保類路徑可用。
提供完整 build.xml,涵蓋編譯、OpenJPA Enhancer 增強實體類、打包 EJB JAR、複製至 JBoss deploy 目錄觸發熱部署。關鍵任務:
compile:編譯原始碼。enhance:呼叫 org.apache.openjpa.ant.PCEnhancerTask 增強位元組碼,支援延遲載入等進階特性。ejbjar:打包並部署。編寫簡單 JSP (Client.jsp) 部署於 JBoss Web 容器,透過 JNDI 查找 AnimalDAO/local 呼叫 persistAnimal,驗證實體持久化成功。瀏覽器訪問 https://localhost:8080/Client.jsp,資料庫 Animal 表應出現新記錄。
OpenJPA 完整實現 JPA 標準,可無縫整合至 JBoss 等 Java EE 容器。關鍵在於:容器管理資料源與 JTA 事務、@PersistenceContext 注入 EntityManager、Session Bean 封裝實體訪問、OpenJPA 庫正確部署至容器類路徑。掌握此流程,即可在企業級環境發揮 OpenJPA 強大的 ORM 能力。