![](/img/trans.png)
[英]How to publish non-Java resources generated at runtime on a Tomcat server?
[英]How to design for JPA in a non-Java EE web server (e.g. Tomcat)
考虑到没有可用的@PersistenceContext来注入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?)
第二个问题是,如何以及何时注入EntityManager?
考虑到在其中创建和关闭EntityManagerFactory的ServletContextListener ,我们可以有一个静态方法,如下所示
public static EntityManager createEntityManager(){
return entityManagerFactory.createEntityManager(PERSISTENT_NAME);
}
但由于我们要封装创建DAO,因此可以使用工厂,例如
public class DAOFactory
{
public static DAO dao(){
//return a new DAO
}
}
按照Point A,我们应该使用ThreadLocal为当前线程使用EntityManager创建DAO。
用于管理交易。
我能想到的最好的方法(模仿JPA规范)是创建自己的Transaction批注,并使用反射注入begin / commit / rollback操作。
然后,您应该从DAOFactory返回一个代理来处理事务
我不会那样做。 为什么尝试自己重新创建整个JPA规范? 您只需要能够在没有容器的情况下使用JPA。
Spring可以帮助您。 试试吧。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.