【发布时间】:2009-06-24 23:24:32
【问题描述】:
考虑到没有@PersistenceContext 可用于注入EntityManager,再加上您需要手动管理事务,那么设计这样一个应用程序的最佳方式是什么?
对于 EntityManagerFactory/EntityManager,据我所知,您必须让每个 DAO 都接受 costructor 中的 EntityManager,例如
public class DAOImpl implements DAO
{
private EntityManager em;
DAOImpl(EntityManager em){
this.em = em;
}
//all CRUD operations follow
}
第一个问题是你什么时候调用EntityManager#close()?
A 点:在我看来,您最好在请求周期结束时在 Filter 中执行此操作,这意味着您将 EntityManager 与当前线程相关联(使用 ThreadLocal?)
第二个问题是,您如何以及何时注入 EntityManager?
考虑到有一个ServletContextListener,我们在其中创建和关闭EntityManagerFactory,我们可以有一个静态方法如下
public static EntityManager createEntityManager(){
return entityManagerFactory.createEntityManager(PERSISTENT_NAME);
}
但由于我们想要封装创建 DAO,我们可以使用工厂,例如
public class DAOFactory
{
public static DAO dao(){
//return a new DAO
}
}
根据 A 点,我们应该使用 ThreadLocal 来为当前线程使用 EntityManager 创建 DAO。
用于管理事务。
我能想到的最好方法(模仿 JPA 规范)是创建自己的事务注释并使用反射来注入开始/提交/回滚操作。
然后您应该从处理事务的 DAOFactory 返回一个 Proxy
【问题讨论】:
标签: java design-patterns