带有EJB的JPA,带有分离的DAO和服务层

Syl*_*ier 7 java ejb jpa

这更像是我目前的架构问题.关于在项目中集成EJB和JPA的最佳实践,我需要帮助.我想拥有能够完成服务层工作的EJB,其中包含我的应用程序的业务逻辑.在这之下,我希望有一个DAO层,我的EJB将使用DAO工厂处理这个层,尽可能地将这两个层分开.知道这一点,我显然不能将我的DAO作为EJB,因为我不希望它们自动注入,因为我希望它们通过工厂创建.这导致我手动创建实体管理器

Persistence.createEntityManagerFactory("PortalEJB").createEntityManager();
Run Code Online (Sandbox Code Playgroud)

现在......这个电话位于我的抽象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) */
}
Run Code Online (Sandbox Code Playgroud)

我觉得这很糟糕,不是吗?这个类的所有具体范围都将有一个全新的持久化上下文副本,我会得到奇怪的行为.而且,当我这样做时,我认为我必须自己在服务层管理交易.我即将为此创建Aspects,例如:

  • 在任何服务层的功能/过程之前创建事务
  • (如果发生任何异常,则回滚事务)
  • 在任何服务层的功能/过程之后提交事务

所以这是我的问题:

  • 我该如何管理EntityManager?
  • 我是否应该使用某种JPA实用程序类来管理它以使一个副本免受多线程的影响?
  • 如果我犯了一个可怕的错误,请提供最佳实践.

Pau*_*gas 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

}
Run Code Online (Sandbox Code Playgroud)

还有一项特殊的服务:

@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

}
Run Code Online (Sandbox Code Playgroud)

有关Java EE 6/7中的更多信息:旧金山JavaOne 2012 的精益部分.

  • 你让我意识到有一件事可能会对我未来的生活有所帮助:最好的解决方案并不总是"按书"解决方案.我希望尽可能"完美",但这会使代码过于复杂.非常感谢你 ;) (2认同)