栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在JSE中使用JPA的EntityManager ThreadLocal模式

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在JSE中使用JPA的EntityManager ThreadLocal模式

在过去的几天中,我设计了一个可能的解决方案。我试图用

BookUnitSession
该类构造的实际上是
EntityManagerHelper
该类:

public class EntityManagerHelper {    private static final EntityManagerFactory emf;     private static final ThreadLocal<EntityManager> threadLocal;    static {        emf = Persistence.createEntityManagerFactory("BookStoreUnit");   threadLocal = new ThreadLocal<EntityManager>();    }    public static EntityManager getEntityManager() {        EntityManager em = threadLocal.get();        if (em == null) { em = emf.createEntityManager(); threadLocal.set(em);        }        return em;    }    public static void closeEntityManager() {        EntityManager em = threadLocal.get();        if (em != null) { em.close(); threadLocal.set(null);        }    }    public static void closeEntityManagerFactory() {        emf.close();    }    public static void beginTransaction() {        getEntityManager().getTransaction().begin();    }    public static void rollback() {        getEntityManager().getTransaction().rollback();    }    public static void commit() {        getEntityManager().getTransaction().commit();    } }

这样的类确保每个线程(即每个请求)将获得其自己的

EntityManager
实例。因此,每个DAO对象可以
EntityManager
通过调用获得正确的实例
EntityManagerHelper.getEntityManager()

根据每次请求会话模式,每个请求必须打开和关闭其自己的

EntityManager
实例,该实例负责将事务中所需的工作单元封装起来。这可以通过实现为的拦截过滤器来完成
ServletFilter

public class EntityManagerInterceptor implements Filter {    @Override    public void destroy() {}    @Override    public void init(FilterConfig fc) throws ServletException {}    @Override    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { try {     EntityManagerHelper.beginTransaction();     chain.doFilter(req, res);     EntityManagerHelper.commit(); } catch (RuntimeException e) {     if ( EntityManagerHelper.getEntityManager() != null && EntityManagerHelper.getEntityManager().isOpen())          EntityManagerHelper.rollback();     throw e; } finally {     EntityManagerHelper.closeEntityManager(); }    }}

这种方法还允许View(例如,JSP页面)获取实体的字段,即使它们已经被延迟初始化(View模式中的Open
Session)。在JSE环境中,

EntityManagerFactory
当servlet容器关闭时,需要显式关闭。这可以通过使用一个
ServletContextListener
对象来完成:

public class EntityManagerFactoryListener implements ServletContextListener {    @Override    public void contextDestroyed(ServletContextEvent e) {        EntityManagerHelper.closeEntityManagerFactory();    }    @Override    public void contextInitialized(ServletContextEvent e) {}}

web.xml
部署描述符:

<listener>  <description>EntityManagerFactory Listener</description>  <listener-class>package.EntityManagerFactoryListener</listener-class></listener><filter>  <filter-name>interceptor</filter-name>  <filter-class>package.EntityManagerInterceptor</filter-class></filter><filter-mapping>  <filter-name>interceptor</filter-name>  <url-pattern>*.do</url-pattern></filter-mapping>


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/406137.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号