关于JPA中的Entitymanager使用延长加载

  hibernate通过SessionFactory管理实体类对数据库的操作,JPA通过EntityManagerFactory产生EntityManager操作数据库中的实体类,我们可以对session进行延迟加载,同样也可以对entityManager进行延迟加载,只需要写一个过滤EntityManager的Filter,就可以将entitymanager延长到JSP页面,具体代码如下:
public class OpenEntityManagerFilter implements Filter {

	private static EntityManagerFactory emf;
	private static final ThreadLocal<EntityManager> tl = new ThreadLocal<EntityManager>();;
	
	public void destroy() {
		// TODO Auto-generated method stub
		if(emf!=null){
			emf.close();
			System.out.println("销毁EntityManagerFactory");
		}
	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		// TODO Auto-generated method stub
		arg2.doFilter(arg0, arg1);
		EntityManager em = tl.get();
		tl.set(null);
		if(em!=null){
			em.close();
			System.out.println("关闭EntityManager");
		}
	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		 emf = Persistence.createEntityManagerFactory("JpaTemp");
	}
	
	public static EntityManager getEntityManager()
	{
		EntityManager em = tl.get();
		if(em==null||!em.isOpen())
		{
			em = (emf!=null)?emf.createEntityManager():null;
			tl.set(em);
			System.out.println("打开EntityManager");
		}
		return em;
	}

}

需要注意的是persistence.xml文件位于src目录下的META-INF目录,并且设置事务类型为RESOURCE_LOCAL,不是JTA,当项目启动时,会自动加载数据库连接和JPA中实体类,并创建EntityManagerFactory

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值