在.ear文件中跨组件共享持久性单元

bam*_*010 33 java persistence jpa glassfish java-ee

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

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

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

Pas*_*ent 47

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

8.2持久性单位包装

...

持久性单元由persistence.xml文件定义 .其META-INF目录包含该persistence.xml文件的jar文件或目录称为持久性单元的根.在Java EE环境中,持久性单元的根必须是以下之一:

  • EJB-JAR文件
  • WAR文件的WEB-INF/classes目录[80]
  • WAR文件的WEB-INF/lib目录中的jar文件
  • EAR库目录中的jar文件
  • 应用程序客户端jar文件

除非持久性单元包含除EJB-JAR或WAR中包含的持久性类之外的持久性类,否则不要求将包含持久性单元的EJB-JAR或WAR文件打包在EAR中.见8.2.1.6节.

注意:Java Persistence 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文件.例如,语法 ../lib/persistenceUnitRoot.jar#myPersistenceUnit 指的是一个持久性单元,其名称在name的name元素中指定persistence.xmlfile,is myPersistenceUnit和为其持久化单元的根的相对路径名 ../lib/persistenceUnitRoot.jar.所述 #语法可与两个可使用unitName注释元素或 persistence-unit-name部署描述符元素来引用在EAR级别定义的持久性单元.

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

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

我只是不确定你理解你的尝试以及你面临的问题.


小智 14

可以通过将persistence.xml放在ear的lib目录中的jar文件中来解决该问题.

persistence.xml必须包含包含实体的jar文件.我不得不给出jar文件的相对路径.我的耳朵结构

|-ear--
       |-lib--|... some libs ...
       |      |--my-persistence-xml.jar
       |-ejb-with-entities1.jar
       |-ejb-with-entities2.jar
Run Code Online (Sandbox Code Playgroud)

我的jboss 7.1.1的persistence.xml

<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>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


jpr*_*ism 8

一切你需要的

EAR +
    |- META-INF +
    |       - persistence.xml
    |- ejb1-module.jar
    |- ejb2-module.jar


<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="my-persistence-unit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>MyDataSource</jta-data-source>
        <!-- Note: it's relative to `persistence-module.jar` file location in EAR -->
        <jar-file>../ejb1-module.jar</jar-file>
        <jar-file>../ejb2-module.jar</jar-file>
        <properties>
            ...

        </properties>
    </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)


Via*_*lov 5

Glassfish的EAR布局示例:

EAR +
    |- lib +
    |      |- core-module.jar
    |      \- persistence-module.jar +
    |                                 \- META-INF +
    |                                              \- persistence.xml
    |- ejb1-module.jar
    \- ejb2-module.jar
Run Code Online (Sandbox Code Playgroud)

EJB模块可以是jar存档或展开目录.

在这种情况下,您persistence.xml可能会像:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="my-persistence-unit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>MyDataSource</jta-data-source>
        <!-- Note: it's relative to `persistence-module.jar` file location in EAR -->
        <jar-file>../ejb1-module.jar</jar-file>
        <jar-file>../ejb2-module.jar</jar-file>
        <properties>
            <property name="hibernate.current_session_context_class" value="jta"/>
            <property name="hibernate.id.new_generator_mappings" value="true"/>
            <property name="hibernate.dialect"      value="org.hibernate.dialect.PostgreSQL82Dialect"/>
            <property name="hibernate.show_sql"     value="true"/>
            <property name="hibernate.format_sql"   value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

<jar-file>如果使用模块版本控制(例如ejb1-module-1.0-SNAPSHOT.jar),则必须更新引用.

@MappedSuperclass注释和EntityManager注入的抽象对象可以放在任何外部jar中.这个罐子不需要提及persistence.xml.例如,您可以创建core-module.jar具有PersistableEntity.java:

public class PersistableEntity {
    @Id
    @GeneratedValue
    private Long id;

    public Long getId() { return id; }

    public Integer getVersion() { return version; }
}
Run Code Online (Sandbox Code Playgroud)

而且PersistableEntityManager.java:

public class PersistableEntityManager<T extends PersistableEntity> {
    @PersistenceContext
    protected EntityManager em;
}
Run Code Online (Sandbox Code Playgroud)

core-module.jar可以通过使用不同的持久化单元,将您的所有项目中使用.您只需继承您的实体和EJB并避免使用样板.查看github上的示例bilionix-core.