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 结构。我们在 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-file 元素没有做它应该做的事情。

我们如何检测我们所有的实体(在我们的两个 JAR 中)?任何人都可以帮助我们吗?

4

1 回答 1

0

我们的解决方案是创建一个自定义 ANT 任务,该任务获取所有使用 @Entity 注释的类(使用反射)。这将为我们生成带有 和 节点的persistence.xml。因此,您想要映射到 PersistenceContext 的每个类都需要在 persistence.xml 中列出。这个persistence.xml 被放置在一个文件夹META-INF 中,该文件夹被包装到my-persistence.jar 中。这个 jar 放在我的 EAR 的 lib 文件夹中。

于 2012-12-06T09:27:45.893 回答