若要讓 Liberty 支援使用「Java™ 持續性 API (JPA)」的應用程式,視您需要的規格層次而定,請將 jpa-2.0、jpa-2.1 或 jpaContainer-2.1 特性新增至 server.xml 檔。另外,您也需要定義持續性環境定義和持續性單位,以及配置實體管理程式和實體管理程式 Factory 的存取權。
關於這項作業
Liberty 中可用的 JPA 特性如下:
- jpa-2.0 特性支援應用程式使用遵循 JPA 2.0 規格來撰寫的應用程式管理及儲存器管理 JPA。這項支援以 Apache OpenJPA 為建置基礎,其延伸規格支援儲存器管理的程式設計模型。
- jpa-2.1 特性支援應用程式使用遵循 JPA 2.1 規格來撰寫的應用程式管理及儲存器管理 JPA。這項支援以 EclipseLink 為建置基礎。如果沒有利用內建
EclipseLink JPA 提供者,您可能會想改用 jpaContainer-2.1 特性,以便盡可能縮小伺服器執行時期映像檔。
jpaContainer-2.1 特性支援應用程式使用遵循 JPA 2.1 規格來撰寫的應用程式管理及儲存器管理 JPA。這項特性不含內建的 JPA 提供者。使用者必須透過共用程式庫、廣域程式庫,或內嵌在應用程式中的程式庫,來提供 JPA 提供者。
如需使用 WebSphere® Developer Tools 來開發 JPA 應用程式的相關資訊,請參閱開發 JPA 應用程式。
程序
將 jpa-2.0、jpa-2.1 或 jpaContainer-2.1 特性新增至 server.xml 檔。
- 新增持續性環境定義和持續性單位定義到 web.xml 檔中。
例如:
<persistence-context-ref>
<persistence-context-ref-name>example/em</persistence-context-ref-name>
<persistence-unit-name>ExamplePersistenceUnit</persistence-unit-name>
</persistence-context-ref>
<persistence-unit-ref>
<persistence-unit-ref-name>example/emf</persistence-unit-ref-name>
<persistence-unit-name>ExamplePersistenceUnit</persistence-unit-name>
</persistence-unit-ref>
- 配置實體管理程式的存取權。
例如:
Context ctx = new InitialContext();
UserTransaction tran = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
tran.begin();
EntityManager em = (EntityManager) ctx.lookup("java:comp/env/example/em");
Thing thing = new Thing();
em.persist(thing);
tran.commit();
- 配置實體管理程式 Factory 的存取權。
例如:
Context ctx = new InitialContext();
EntityManagerFactory emf = (EntityManagerFactory) ctx.lookup("java:comp/env/example/emf");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Thing thing = new Thing();
em.persist(thing);
tx.commit();
int id = thing.getId();
em.close();
如果您使用 jpaContainer-2.1 特性,請提供 JPA 提供者 JAR 檔。 選擇下列其中一個選項:
- 將 JPA 提供者 JAR 檔放入廣域程式庫位置,供所有應用程式使用。
- 更新伺服器配置,將 JPA 提供者 JAR 檔當作共用程式庫,提供給應用程式。
例如,完成下列步驟:
在您的伺服器配置檔中,為必要的 JPA 持續性提供者配置共用程式庫。提供程式庫給使用它的應用程式。下列範例說明以
EclipseLink 作為 JPA 2.1 提供者時,所需的最小一組 jar 檔(不含任何延伸項目)。也可以包含下列 jar,以充分利用
EclipseLink 的延伸項目:- org.eclipse.persistence.dbws.jar
- org.eclipse.persistence.moxy.jar
<library id="eclipselink">
<file name="${server.config.dir}/jpa/org.eclipse.persistence.asm.jar/>
<file name="${server.config.dir}/jpa/org.eclipse.persistence.core.jar"/>
<file name="${server.config.dir}/jpa/org.eclipse.persistence.jpa.jar"/>
<file name="${server.config.dir}/jpa/org.eclipse.persistence.antlr.jar"/>
<file name="${server.config.dir}/jpa/org.eclipse.persistence.jpa.jpql.jar"/>
<file name="${server.config.dir}/jpa/org.eclipse.persistence.jpa.modelgen.jar"/>
</library> <application location="myApp.war">
<classloader commonLibraryRef="eclipselink"/>
</application>
如果要使用
hibernate 作為 JPA 提供者,請在 <library> 配置中改包含下列這組 jar 檔。
<library id="hibernate">
<file name="${server.config.dir}/hibernate/antlr-2.7.7.jar"/>
<file name="${server.config.dir}/hibernate/classmate-1.3.0.jar"/>
<file name="${server.config.dir}/hibernate/dom4j-1.6.1.jar"/>
<file name="${server.config.dir}/hibernate/hibernate-commons-annotations-5.0.1.Final.jar"/>
<file name="${server.config.dir}/hibernate/hibernate-core-5.2.6.Final.jar"/>
<file name="${server.config.dir}/hibernate/javassist-3.20.0-GA.jar"/>
<file name="${server.config.dir}/hibernate/jboss-logging-3.3.0.Final.jar"/>
</library>
- 選擇下列其中一種方式來識別 JPA 提供者類別:
- 在伺服器配置的 JPA 元素上,配置預設的持續性提供者。此配置會置換 <bell> 元素所探索的任何
PersistenceProvider 服務:
<jpa defaultPersistenceProvider="org.eclipse.persistence.jpa.PersistenceProvider"/>
若為
Hibernate,請使用:
<jpa defaultPersistenceProvider="org.hibernate.jpa.HibernatePersistenceProvider"/>
- 如果正在使用 jpaContainer-2.1 特性,請在伺服器配置中配置 bells-1.0 特性,並為共用程式庫新增 bell。
共用程式庫會自動尋找 JPA 提供者類別,並將它設為預設 JPA 持續性提供者。此配置會置換 JPA 元素上配置的 defaultPersistenceProvider 屬性。
<featureManager>
<feature>jpaContainer-2.1</feature>
<feature>bells-1.0</feature>
...
</featureManager>
<bell libraryRef="eclipselink"/>
- 在 persistence.xml 檔中指定 JPA 持續性提供者類別。對於持續性單元,這個類別的優先順序高於 server.xml 配置(<jpa> 元素或 <bell> 元素)。
<persistence-unit name="MY_PERSISTENCE_UNIT">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
...
</persistence-unit>