我将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中的类被我的业务逻辑代码识别为实体?
答案 0 :(得分:2)
在peristence.xml
<persistence-unit name="YourUnit">
<class>com.package.User</class>
<class>com.package.AnotherEntity</class>
...