首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在war中找不到外部jar的JPA实体

在war中找不到外部jar的JPA实体
EN

Stack Overflow用户
提问于 2015-03-04 11:12:20
回答 2查看 3.1K关注 0票数 0

我在JPA 2和Hibernate 4.2的JBoss EAP6.1上运行了以下web应用程序(war)的结构:

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

在我的web应用程序项目(Application.war)中,我有一个包含EntityManager的EJB。在EJB中,我想为来自Entity.jar的实体创建一个JQL查询(JQL,em.createQuery)。

如果调用包含查询的EJB方法,则会得到以下错误:

代码语言:javascript
运行
复制
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的实体用户如下所示:

代码语言:javascript
运行
复制
@Entity
@Table(name = "PL1_USER")
public class User implements Serializable {
...

来自Application.war的EJB:

代码语言:javascript
运行
复制
@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();
}
}

persistence.xml来自Application.war (WEB/classes/META):

代码语言:javascript
运行
复制
<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的结构:

代码语言:javascript
运行
复制
- 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

如果你需要更多的信息/细节,请告诉我。

我已经在谷歌上搜索过了,但是我发现没有任何东西对我有用。

如果有人能帮我我很高兴。

EN

回答 2

Stack Overflow用户

发布于 2015-03-04 11:27:28

Pro一书指出了关于包含JAR文件中的实体的如下内容:

在jar-file元素中列出JAR时,它必须相对于META/sistence.xml文件所在的JAR文件的父文件列出。与您在清单中的类路径条目中放置的内容相匹配。例如,假设我们将调用emp.ear的企业存档(EAR)是结构化的,如清单13-5所示。

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

  • emp.ear
    • emp-ejb.jar
      • META/sistentence.xml

代码语言:javascript
运行
复制
- lib/emp-classes.jar 
    - examples/model/Employee.class

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

清单13-6.persistence.xml含量

代码语言:javascript
运行
复制
<persistence-unit name="EmployeeService">
<jta-data-source>java:app/jdbc/EmployeeDS</jta-data-source>
<jar-file>lib/emp-classes.jar</jar-file>
</persistence-unit>
票数 0
EN

Stack Overflow用户

发布于 2015-03-04 14:58:17

问题似乎涉及到jboss-deployment-structure.xml。Entity.jar也用于Application.war的登录机制(JAAS),因此相同的Entity.jar可以作为EAP模块使用,并包含在Application.war的jboss-deployment-structure.xml中。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28852995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档