繁体   English   中英

如何在非Java EE Web服务器(例如Tomcat)中设计JPA

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM