这是我目前的架构问题。关于在项目中集成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) */
}
我认为这很糟糕,不是吗?这个类的所有具体范围都将有一个全新的持久化上下文副本,我会得到奇怪的行为。此外,当我这样做时,我认为我必须自己在服务层管理交易。我即将为此创建Aspects,例如:
所以这是我的问题:
答案 0 :(得分:5)
您是否看过Adam Bien JPA/EJB3 KILLED THE DAO和DAOS AREN'T DEAD - BUT THEY EITHER COLLAPSED OR DISAPPEARED的帖子?
另一方面,您可以考虑服务层的抽象类:
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
}
请参阅旧金山JavaOne 2012的Java EE 6/7: The Lean Parts中的详细信息。