在 .ear 文件中的组件之间共享持久性单元

2022-09-01 07:20:23

在我使用 .ear 打包的 Java EE 6 应用程序中,我想创建一个持久性单元,可以从不同.jar文件中的组件访问该单元。

但是,我不确定如何定义此持久性单元。使用@PersistenceContext注释时,仅当名称与本地持久性.xml文件中定义的持久性单元匹配时,查找才会成功。

是否可以引用外部持久性单元?


答案 1

以下是 JPA 2.0 规范的相关部分:

8.2 持久性单元打包

...

持久性单元由文件定义。其目录包含该文件的 jar 文件或目录称为持久性单元的根。在 Java EE 环境中,持久性单元的根必须是以下之一:persistence.xmlMETA-INFpersistence.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 可以定义持久性单元。

使用注释元素或部署描述符元素引用持久性单元时,持久性单元的可见性范围由其定义点确定:unitNamepersistence-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#myPersistenceUnitpersistence.xmlmyPersistenceUnit../lib/persistenceUnitRoot.jar#unitNamepersistence-unit-name

此外,您需要在pu jar的清单中包含实体类jar http://wiki.eclipse.org/Packaging_and_Deploying_EclipseLink_JPA_Applications_(ELUG)

总而言之,您应该能够在 EAR 的顶层定义实体和持久性单元,并从其他模块中使用它们。

我只是不确定是否理解你尝试了什么以及你遇到了什么问题。


答案 2

这个问题可以通过将持久性.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>

希望这有帮助


推荐