【发布时间】:2013-07-01 06:03:02
【问题描述】:
这更像是我目前遇到的架构问题。我需要有关在项目中集成 EJB 和 JPA 的最佳实践方面的帮助。我想要 EJB 来完成服务层的工作,包含我的应用程序的业务逻辑。在此之下,我希望有一个 DAO 层,我的 EJB 将使用 DAO 工厂来尽可能地分离这两个层。知道了这一点,我显然不能将我的 DAO 设为 EJB,因为我不希望它们自动注入,因为我希望它们是通过工厂创建的。这导致我使用手动创建实体管理器
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 实用程序类来管理它以保护一个副本免受多线程处理?
- 如果我犯了严重错误,请提供最佳做法。
【问题讨论】:
-
Java EE 的哪个版本?
-
我在 GlassFish 3.1 上使用 EJB 3.1、Java 1.6、JPA 2.0 (EclipseLink)