来自外部jar的JPA实体未在战争中找到

时间:2015-03-04 11:12:21

标签: hibernate java-ee jpa jboss-eap-6

我在JBoss EAP 6.1上使用JPA 2和Hibernate 4.2运行以下Web应用程序(war)结构:

  • Entity.jar(来自其他内部项目)
  • Application.war(包含WEB-INF / lib中的Entity.jar,包含为maven依赖,而不是maven模块)

在我的Web应用程序项目(Application.war)中,我有一个包含EntityManager的EJB。在EJB中,我想从Entity.jar为实体创建一个JQL-Query(em.createQuery)。

如果我调用包含查询的EJB方法,我收到错误:

Caused by: javax.ejb.EJBException: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped [SELECT u FROM User as u WHERE u.name = :name]

来自Entity.jar的我的实体用户看起来像:

@Entity
@Table(name = "PL1_USER")
public class User implements Serializable {
...

Application.war中的EJB:

@Stateless
public class UserService {

@PersistenceContext(unitName = "my-unit")
private EntityManager entityManager;

public User getUser(String username) {
    TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User as u WHERE u.name = :name", User.class);
    query.setParameter("name", username);
    return query.getSingleResult();
}
}
来自Application.war的persistence.xml(WEB-INF / classes / META-INF):

<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="my-unit" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:jboss/datasource/MY-DS</jta-data-source>

    <jar-file>Entity.jar</jar-file>

    <properties>
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
        <property name="hibernate.archive.autodetection" value="class, hbm" />
        <property name="hibernate.show_sql" value="false" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.use_sql_comments" value="false" />
        <property name="hibernate.jdbc.batch_size" value="30" />
        <property name="hibernate.jdbc.fetch_size" value="100" />
        <property name="hibernate.max_fetch_depth" value="0" />
        <property name="hibernate.order_updates" value="true" />
        <property name="hibernate.use_identifier_rollback" value="true" />

        <!-- JDBC Driver returns row count for batch statements -->
        <property name="hibernate.jdbc.batch_versioned_data" value="true" />

        <property name="hibernate.dialect" value="org.hibernate.dialect.DB2400Dialect" />

    </properties>
</persistence-unit>

Application.war的结构:

- Application.war
    - META-INF
        - MANIFEST.MF (containing Entity.jar in Class-Path)
    - resources
    - WEB-INF
        - com
            - example
                - UserService.class
        - classes
            - META-INF
                - persistence.xml
        - lib
            - Entity.jar
    - index.xhtml

如果您需要更多信息/详情,请告诉我们。

我已经在google上搜索了,但我发现的任何内容都不适用于我。

如果有人能帮助我,我感到非常高兴。

2 个答案:

答案 0 :(得分:0)

本书Pro JPA2注意到以下关于在JAR文件中包含实体的内容:

在jar文件元素中列出JAR时,必须相对于JAR文件的父元素列出它 META-INF / persistence.xml文件所在的位置。这与您在类路径中放置的内容相匹配 进入清单。例如,假设我们称之为emp.ear的企业归档(EAR)是 结构如清单13-5所示。

清单13-5。外部JAR中的实体

  • emp.ear
    • EMP-ejb.jar
      • META-INF / persistence.xml中
    • LIB / EMP-classes.jar
      • 实例/模型/ Employee.class

persistence.xml文件的内容应该如清单13-6所示,带有jar文件 包含“lib / emp-classes.jar”的元素,用于引用lib目录中的emp-classes.jar EAR文件。这将导致提供程序添加它在emp-classes.jar中找到的带注释的类 (Employee.class)到持久性单元,并且因为jar是在EAR的lib目录中,所以它会 自动在应用程序类路径上。

清单13-6。 persistence.xml的内容

<persistence-unit name="EmployeeService">
<jta-data-source>java:app/jdbc/EmployeeDS</jta-data-source>
<jar-file>lib/emp-classes.jar</jar-file>
</persistence-unit>

答案 1 :(得分:0)

问题似乎是参考了jboss-deployment-structure.xml。 Entity.jar还用于Application.war的登录机制(JAAS),因此相同的Entity.jar可用作EAP模块,并包含在Application.war的jboss-deployment-structure.xml中。

也许JBoss EAP会忽略Application.war的lib目录中的Entity.jar,因为它已经在jboss-deployment-structure.xml中声明并通过EAP模块包含。