在 .ear 文件中的组件之间共享持久性单元
在我使用 .ear 打包的 Java EE 6 应用程序中,我想创建一个持久性单元,可以从不同.jar文件中的组件访问该单元。
但是,我不确定如何定义此持久性单元。使用@PersistenceContext注释时,仅当名称与本地持久性.xml文件中定义的持久性单元匹配时,查找才会成功。
是否可以引用外部持久性单元?
在我使用 .ear 打包的 Java EE 6 应用程序中,我想创建一个持久性单元,可以从不同.jar文件中的组件访问该单元。
但是,我不确定如何定义此持久性单元。使用@PersistenceContext注释时,仅当名称与本地持久性.xml文件中定义的持久性单元匹配时,查找才会成功。
是否可以引用外部持久性单元?
以下是 JPA 2.0 规范的相关部分:
8.2 持久性单元打包
...
持久性单元由文件定义。其目录包含该文件的 jar 文件或目录称为持久性单元的根。在 Java EE 环境中,持久性单元的根必须是以下之一:
persistence.xml
META-INF
persistence.xml
- 一个 EJB-JAR 文件
- WAR文件的WEB-INF/classes目录[80]
- WAR 文件的 WEB-INF/lib 目录中的 jar 文件
- EAR 库目录中的 jar 文件
- 应用程序客户端 jar 文件
不需要将包含持久性单元的 EJB-JAR 或 WAR 文件打包到 EAR 中,除非持久性单元除了包含 EJB-JAR 或 WAR 中包含的持久性类之外,还包含持久性类。请参见第 8.2.1.6 节。
注: Java 持久性 1.0 支持在 EAR 的根中使用 jar 文件作为持久性单元的根。不再支持此用法。在这种情况下,可移植应用程序应改用 EAR 库目录。见[9]。
持久性单元必须具有名称。在单个 EJB-JAR 文件、单个 WAR 文件、单个应用程序客户机 jar 中或 EAR 中,只能定义任何给定名称的一个持久性单元。请参见第 8.2.2 节 “持久化单元作用域”。
该文件可用于在同一范围内指定多个持久性单元。
persistence.xml
在 Java EE EAR 级别定义的所有持久性类都必须可供应用程序中的所有其他 Java EE 组件访问 (即由应用程序类装入器装入), 这样,如果两个不同的 Java EE 组件(可能使用不同的持久性单元)引用同一实体类,则引用的类是相同的类。
稍后:
8.2.2 持久性单元范围
EJB-JAR、WAR、应用程序客户机 jar 或 EAR 可以定义持久性单元。
使用注释元素或部署描述符元素引用持久性单元时,持久性单元的可见性范围由其定义点确定:
unitName
persistence-unit-name
- 在 EJB-JAR、WAR 或应用程序客户端 jar 级别定义的持久性单元的作用域分别限定为该 EJB-JAR、WAR 或应用程序 jar,并且对该 jar 或 war 中定义的组件可见。
- 在 EAR 级别定义的持久性单元通常对应用程序中的所有组件都可见。但是,如果由 EAR 中的 EJB-JAR、WAR 或应用程序 jar 文件定义了同名的持久性单元,那么在 EAR 级别定义的该名称的持久性单元对于由该 EJB-JAR、WAR 或应用程序 jar 文件定义的组件将不可见,除非持久性单元引用使用持久性单元名称
#
语法来指定路径名以消除引用的歧义。 使用语法时,路径名相对于引用应用程序组件 jar 文件。例如,语法引用一个持久性单元,其名称(如在文件的 name 元素中指定的那样)是 持久性单元的根的相对路径名是 。该语法可以与注释元素或部署描述符元素一起使用,以引用在 EAR 级别定义的持久性单元。#
../lib/persistenceUnitRoot.jar#myPersistenceUnit
persistence.xml
myPersistenceUnit
../lib/persistenceUnitRoot.jar
#
unitName
persistence-unit-name
此外,您需要在pu jar的清单中包含实体类jar http://wiki.eclipse.org/Packaging_and_Deploying_EclipseLink_JPA_Applications_(ELUG)
总而言之,您应该能够在 EAR 的顶层定义实体和持久性单元,并从其他模块中使用它们。
我只是不确定是否理解你尝试了什么以及你遇到了什么问题。
这个问题可以通过将持久性.xml放在位于耳朵的lib目录中的jar文件中来解决。
持久性.xml必须包含包含实体的 jar 文件。我必须给出jar文件的相对路径。我的耳朵结构
|-ear--
|-lib--|... some libs ...
| |--my-persistence-xml.jar
|-ejb-with-entities1.jar
|-ejb-with-entities2.jar
我的持久性.xml jboss 7.1.1
<persistence-unit name="my-pu" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/mypu</jta-data-source>
<jar-file>../ejb-with-entities1.jar</jar-file>
<jar-file>../ejb-with-entities1.jar</jar-file>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
希望这有帮助