考虑到没有 @PersistenceContext 可用于注入(inject) EntityManager,而且您需要手动管理事务,设计此类应用程序的最佳方法是什么?
对于 EntityManagerFactory/EntityManager,据我所知,您必须让每个 DAO 在构造函数中接受 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?)
第二个问题是,如何以及何时注入(inject) 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 规范)是创建您自己的事务注释并使用反射来注入(inject)开始/提交/回滚操作。
然后您应该返回 Proxy来自处理事务的 DAOFactory
最佳答案
我不会做这一切。为什么要尝试自己重新创建整个 JPA 规范?您只需要能够在没有容器的情况下使用 JPA 即可。
Spring 可以帮助你解决这个问题。尝试一下。
关于java - 如何在非 Java EE Web 服务器(例如 Tomcat)中设计 JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1041480/