我在JPA 2和Hibernate 4.2的JBoss EAP6.1上运行了以下web应用程序(war)的结构:
在我的web应用程序项目(Application.war)中,我有一个包含EntityManager的EJB。在EJB中,我想为来自Entity.jar的实体创建一个JQL查询(JQL,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();
}
}persistence.xml来自Application.war (WEB/classes/META):
<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如果你需要更多的信息/细节,请告诉我。
我已经在谷歌上搜索过了,但是我发现没有任何东西对我有用。
如果有人能帮我我很高兴。
发布于 2015-03-04 11:27:28
Pro一书指出了关于包含JAR文件中的实体的如下内容:
在jar-file元素中列出JAR时,它必须相对于META/sistence.xml文件所在的JAR文件的父文件列出。与您在清单中的类路径条目中放置的内容相匹配。例如,假设我们将调用emp.ear的企业存档(EAR)是结构化的,如清单13-5所示。
清单13-5.外部JAR中的实体
- 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含量
<persistence-unit name="EmployeeService">
<jta-data-source>java:app/jdbc/EmployeeDS</jta-data-source>
<jar-file>lib/emp-classes.jar</jar-file>
</persistence-unit>发布于 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模块包含。
https://stackoverflow.com/questions/28852995
复制相似问题