这是一个架构问题,我需要关于在项目中集成EJB和JPA的最佳实践方面的帮助。我想要有EJB来完成服务层的工作,包含应用程序的业务逻辑。接下来,我想要有一个DAO层,我的EJB将使用DAO工厂来处理它们,以尽可能分离这两个层次。显然,我不能将我的DAO也作为EJB,因为我不希望它们被自动注入,而是希望通过工厂创建它们。这导致我需要手动创建entitymanager。
Persistence.createEntityManagerFactory("PortalEJB").createEntityManager();
现在...这个调用位于我的抽象JPA DAO中:
public abstract class JPADataAccessorObject<K, E> implements DataAccessorObject<K, E> {
protected Class<E> entityClass;
protected EntityManager entityManager;
protected JPADataAccessorObject(Class<E> pEntityClass) {
this.entityManager = Persistence.createEntityManagerFactory("PortalEJB").createEntityManager();
this.entityClass = pEntityClass;
}
/* Other DAO functions (update, delete, create) */
}
我认为这是不好的,对吧?我的所有此类具体范围都将拥有一个全新的持久化上下文副本,我会得到奇怪的行为。此外,当我这样做时,我认为我必须在服务层自己管理事务。我正要为此创建方面,例如:
- 在任何服务层函数/过程之前创建事务
- (如果出现任何异常,则回滚事务)
- 在任何服务层函数/过程之后提交事务
- 我应该如何管理EntityManager?
- 我是否应该有某种JPA实用程序类来管理它,以保护免受多线程影响的一个副本?
- 如果我犯了严重错误,请提供最佳实践。