为允许 Liberty 支持使用 Java™ Persistence API (JPA) 的应用程序,应根据您需要的规范级别将 jpa-2.0、jpa-2.1 或 jpaContainer-2.1 功能部件添加至 server.xml 文件。您还需要定义持久性上下文和持久性单元,以及配置对实体管理器和实体管理器工厂的访问权。
关于此任务
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();
- 配置对实体管理器工厂的访问权。
例如:
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 持久性提供者配置共享库。使库可供使用此库的应用程序使用。以下示例说明了最低需要的一组 JAR 文件,以将 EclipseLink 用作 JPA 2.1 提供程序,没有扩展。还可以包括下列 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 提供程序,请将下面这一组 JAR 文件包括在 <library> 配置中。
<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>