7

这更像是我目前遇到的架构问题。我需要有关在项目中集成 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 实用程序类来管理它以保护一个副本免受多线程处理?
  • 如果我犯了一个可怕的错误,请提供最佳实践。
4

1 回答 1

6

你看过 Adam Bien JPA/EJB3 杀死 DAODAOS 没有死 - 但他们要么崩溃要么消失的帖子吗?

另一方面,您可以考虑服务层的抽象类:

public abstract class AbstractFacade<E extends Serializable, 
                                     PK extends Serializable> {

    private final transient Class<E> entityClass;

    public AbstractFacade(final Class<E> entityClass) {
        this.entityClass = entityClass;
    }

    protected abstract EntityManager getEntityManager();

    public void create(final E entity) {
        final EntityManager entityManager = getEntityManager();
        entityManager.persist(entity);
    }

    public final E find(final PK id) {
        return getEntityManager().find(entityClass, id);
    }

    // Other common operations

}

和一个特定的服务

@Stateless
public class UserFacade extends AbstractFacade<User, String> {

    @PersistenceContext(unitName = "MyPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public UserFacade() {
        super(User.class);
    }

    // Other methods of this service

}

在 Java EE 6/7:旧金山 JavaOne 2012的精益部分中查看更多信息。

于 2013-07-03T14:20:45.513 回答