2011-04-08 94 views
2

我们有一个EAR应用程序,其中包含一个ejb模块,其中包含所有的enity bean以及很少的会话bean和pojos。它有一个persistence.xml。现在还有其他的web模块是spring mvc app,它在ejb模块中使用实体bean。现在要使用jpa,我必须在web模块中创建一个persistence.xml。但是它已经被复制,因为我们已经在ejb模块中。有没有什么办法可以保留一个persistence.xml,并将在ejb和web模块中使用。有人可以给我简单的项目结构作为例子。只是为了知识,我们正在使用maven。如何在EAR中的ejb模块和Web模块之间共享Persistence.xml?

感谢

回答

2


你可以把你的persistence.xml与实体类一起为你把你耳朵的/ lib文件夹一个单独的罐子。

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

感谢您的回复。但现在我的问题是,Spring如何知道在哪里寻找entitymanagerfactory。我的意思是我如何声明一个spring bean,以便它会查找已经在jndi中注册过的持久化单元。 – user509755 2011-04-08 18:17:27

+0

我不确定我是否确切地得到了问题,但从我的看法来看,您可以在您的Persistence.jar中声明一个spring上下文,并将其导入为您的war和/或EJB定义的上下文中。 – sebastiencol 2011-04-11 09:27:38

+0

我发现我必须使用在jboss jndi上下文中使用实体管理器工厂。但是当我在Spring 3中使用上面的bean声明时,它会抛出NameNotFoundException异常。 – user509755 2011-04-12 23:10:22

0

这是我的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> 

和春季的context.xml

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

0

我很难用Maven实现它。如果你将使用Maven来打包你的项目,下面的设置将在你的ear文件的/ lib目录中放置ejb-and-web模块之间的共享依赖项(耳朵的pom依赖项中定义为<type>jar</type>的任何东西):

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