我在JBoss EAP 6.1上使用JPA 2和Hibernate 4.2运行以下Web应用程序(war)结构:
在我的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上搜索了,但我发现的任何内容都不适用于我。
如果有人能帮助我,我感到非常高兴。
答案 0 :(得分:0)
本书Pro JPA2注意到以下关于在JAR文件中包含实体的内容:
在jar文件元素中列出JAR时,必须相对于JAR文件的父元素列出它 META-INF / persistence.xml文件所在的位置。这与您在类路径中放置的内容相匹配 进入清单。例如,假设我们称之为emp.ear的企业归档(EAR)是 结构如清单13-5所示。
清单13-5。外部JAR中的实体
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模块包含。