2011-04-08 62 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>