EAR中的EJB3代码无法看到EJB客户端jar(在/ lib中)中定义的JPA实体(抛出“java.lang.IllegalArgumentException:Not an entity:”)

时间:2012-08-14 11:20:36

标签: jpa jboss ejb-3.0

我将EJB3代码考虑在内:

(i)用于构建“EJB client jar”的业务逻辑接口和POJO实体bean,以及

(ii)实现业务接口的业务逻辑代码,并使用数据库执行JPA。

部署的平台是带有Hibernate JPA的JBoss AS7.1。

这个想法是 EJB客户端jar 是将与 war wars 一起部署的接口,它们访问业务逻辑码。我正在将 EJB3 业务逻辑代码部署为 EAR ,内部没有 WAR WAR 是独立部署的) 。因此,顶级业务逻辑 EAR 的结构如下:

.
├── lib
│   ├── commons-lang3-3.1.jar
│   └── Users-client.jar
├── META-INF
│   ├── application.xml
│   └── MANIFEST.MF
└── Users-ejb.jar

在上面的例子中, Users-client.jar EJB客户端jar (接口)和 Users-ejb.jar 是业务逻辑实现和JPA代码。

业务逻辑实现代码( Users-ejb.jar )的结构是:

├── base
│   └── AbstractFacade.class
├── facades
│   ├── PrivateUserDataFacade.class
│   └── UserFacade.class
├── META-INF
│   ├── MANIFEST.MF
│   ├── persistence.xml
│   └── postgres-ds.xml
└── utils
    └── JPUtil.class

persistence.xml 包含以下标记:

 <exclude-unlisted-classes>false</exclude-unlisted-classes>  

但是,通过上述设置, Users-ejb.jar 中的代码无法识别@Entity bean将 Users-client.jar 定义为实体。在代码编译和部署时,这不是类未找到问题,而是在运行时抛出“非实体”异常。

因此,例如,类 UserFacade.class 中的以下测试方法:

public String boo(String name)
{                                                                   
    javax.persistence.criteria.CriteriaQuery cq =
      getEntityManager().getCriteriaBuilder().createQuery();
    cq.select(cq.from(User.class)); // <-- exception thrown
    List<User> all = getEntityManager().createQuery(cq).getResultList();
    return "boo"+name;
}             

在标有跟踪的地方失败:

Caused by: java.lang.IllegalArgumentException: Not an entity: class entities.User
at org.hibernate.ejb.metamodel.MetamodelImpl.entity(MetamodelImpl.java:158)
[hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.ejb.criteria.QueryStructure.from(QueryStructure.java:136)
[hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.ejb.criteria.CriteriaQueryImpl.from(CriteriaQueryImpl.java:177)
[hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
at facades.UserFacade.boo(UserFacade.java:46) [Users-ejb.jar:]

我应该怎样做才能确保lib / Users-client.jar中的类被我的业务逻辑代码识别为实体?

1 个答案:

答案 0 :(得分:2)

peristence.xml

中定义实体
  <persistence-unit name="YourUnit">
     <class>com.package.User</class>
     <class>com.package.AnotherEntity</class>
...