【问题标题】:How to share Persistence.xml between ejb module and web module in EAR?如何在 EAR 中的 ejb 模块和 web 模块之间共享 Persistence.xml?
【发布时间】:2011-08-01 03:19:27
【问题描述】:

我们有一个带有一个 ejb 模块的 EAR 应用程序,其中包含所有的实体 bean 和少量的会话 bean 和 pojo。它有一个persistence.xml。现在还有其他 web 模块是 spring mvc 应用程序,它在 ejb 模块中使用实体 bean。现在要使用 jpa,我也必须在 web 模块中创建一个 persistence.xml。但它是重复的,因为我们已经在 ejb 模块中。有什么方法可以让我只保留一个persistence.xml,并将在ejb 和web 模块中使用。有人可以给我一个简单的项目结构作为例子。只是为了了解我们正在使用 maven。

谢谢

【问题讨论】:

    标签: hibernate spring jpa maven


    【解决方案1】:

    我很难用 Maven 实现这个。如果您将使用 Maven 打包您的项目,以下设置会将 shared-between-ejb-and-web 模块依赖项(ear 的 pom 依赖项中定义为 <type>jar</type> 的任何内容)放在您的 ear 文件的 /lib 目录中:

    <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <configuration>
            <defaultLibBundleDir>lib/</defaultLibBundleDir>
        …
    </plugin>
    

    【讨论】:

      【解决方案2】:

      这是我的 persistence.xml 和 applicationContext.xml 的示例 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 版本="1.0">

      <persistence-unit name="acme" transaction-type="JTA">
          <provider>org.hibernate.ejb.HibernatePersistence</provider>
          <jta-data-source>java:/acmeDS</jta-data-source>
          <properties>
              <property name="hibernate.hbm2ddl.auto" value="none" />
              <property name="hibernate.show_sql" value="true" />
              <property name="jboss.entity.manager.factory.jndi.name" value="persistence-units/acmeManager"/>
               <property name="jboss.entity.manager.jndi.name" value="persistence-units/acme"/>
          </properties>
      </persistence-unit>
      

      还有 Spring context.xml

      <jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence-units/acme" />
      <bean
          class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
      

      【讨论】:

        【解决方案3】:


        您可以将您的 persistence.xml 与您的实体类一起放入一个单独的 jar 中,该 jar 放在您 EAR 的 /lib 文件夹中。

        yourEar.ear
            |
            |_ yourEjb.jar
            |
            |_ yourWeb.war
            |
            |_ lib
                |
                |_ yourPersistence.jar
                       |
                       |_ META-INF/persistence.xml
                       |
                       |_ yourEntity.class
        

        【讨论】:

        • 感谢您的回复。但现在我的问题是 spring 如何知道在哪里寻找 entitymanagerfactory。我的意思是我如何声明一个spring bean,以便它查找已经在jndi中注册的持久性单元。
        • 我不确定我得到了确切的问题,但根据我的理解,您可以在 yourPersistence.jar 中声明一个 spring 上下文并将其导入为您的战争和/或 EJB 定义的上下文中.
        • 我发现我必须使用 在 jboss jndi 上下文中使用实体管理器工厂。但是当我在 spring 3 中使用上面的 bean 声明时,它会抛出 NameNotFoundException。
        • 你能发布你的 persistence.xml 文件吗?
        • 请查看我的 persistence.xml 和 spring context.xml 的上述评论
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        相关资源
        最近更新 更多