2012-10-19 21 views
2

我需要一個EAR Java應用程序,在該應用程序中可以定義持久性單元並在不同組件中使用該持久性單元。例如:我在我的application.xml中定義了2個JAR:my-product.jar和my-product-module.jar - 兩個JAR文件都應該能夠使用相同的PersistenceUnit。這個PersistenceUnit是在一個單獨的jar中定義的,它是我的EAR應用程序的lib文件夾。 在JAR文件中,沒有其他persistence.xml。所以在整個EAR文件夾中:只有1個persistence.xml。當持久化單元處於EAR級別時未映射實體EAR級別

我目前有以下的EAR結構。我們正在部署一個JBoss 6.1.0.Final服務器。

/ 
-- lib 
| | 
| -- my-persistence.jar 
|   | 
|   -- META-INF 
|     | 
|     -- persistence.xml 
-- my-product.jar 
| 
-- my-product.war 
| 
-- my-product-module.jar 

我的persistence.xml正在尋找這樣的:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="MyPersistenceUnitName"> 
       <jta-data-source>java:/MyDatasource</jta-data-source> 
       <jar-file>../my-product.jar</jar-file> 
       <jar-file>../my-product-module.jar</jar-file>  
       <properties> 
        <property name="jboss.entity.manager.factory.jndi.name" value="java:/MyProduct/ManagerFactory" /> 
        <property name="jboss.entity.manager.jndi.name" value="java:/MyProduct/EntityManager" /> 
      </properties> 
    </persistence-unit> 
</persistence> 

所有這一切工作正常。持久性單元在EAR上下文中被檢測和綁定。 但是,從目前我們創建了一個JPA的查詢,我們問了EntityManager執行查詢,我們得到以下錯誤:

org.hibernate.hql.ast.QuerySyntaxException: MyEntity is not mapped [from MyEntity] 

所以我們所有的實體未映射/加載應用程序時檢測到。它看起來像jar文件元素沒有做它應該做的。

我們如何檢測我們的所有實體(在我們的兩個JAR中)? 有人能幫助我們嗎?

+0

我建議你使用EJB項目,其中包含所有與持久性相關的數據,如實體。並將該jar添加到您所需的項目中。 –

回答

0

我們的解決方案是創建一個自定義的ANT任務,獲取所有使用@Entity註解的類(使用反射)。這將爲我們,以及節點生成persistence.xml。因此,每個想要映射到PersistenceContext的類都需要在persistence.xml中列出。這個persistence.xml放置在一個META-INF文件夾內,該文件夾被包裝到my-persistence.jar中。這個jar放在我的EAR的lib文件夾中。

相關問題