Hibernate(9)懒加载问题解决方案

xiaoxiao2021-02-28  120

0 懒加载概念

①懒加载(load on demand)是一种独特而又强大的数据获取方法,是指程序推迟访问数据库,这样做可以保证有时候不必要的访问数据库,因为访问一次数据库是比较耗时的。 ②当我们查询一个对象的时候,默认情况下,返回的只是该对象的普通属性,当用户去使用对象属性时,才会向数据库发出再一次的查询,这种现象称为lazy加载现象。

1在Student.hbm.xml中配置关闭懒加载方式:

<class name="com.test.domain.Student" table="STUDENT" lazy="false" schema="SCOTT">

2 Hibernate.initialize(代理对象)

显示的初始化代理对象Hibernate.initialize((new Student()).getStudcourses());

3 OpenInView—通过过滤器Filter实现

原理: 缺点是:session关闭会延时 Filter文件,不需要在web.xml中配置filter

public class MyFilter extends HttpServlet implements Filter { @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { Session session = null; Transaction ts = null; try { session = HibernateUtil.getCurrentSession(); ts = session.beginTransaction(); // 整个请求完成,才会执行doFilter方法 arg2.doFilter(arg0, arg1); ts.commit(); } catch (Exception e) { if(ts!=null) { ts.rollback(); } e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { HibernateUtil.closeCurrentSession(); } } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }

HibernateUtil工具类文件 以OpenInView为后缀的配合上边的Filter使用

public final class HibernateUtil { private static SessionFactory sessionFactory = null; // 线程局部模式 private static ThreadLocal<Session> threadLoacal = new ThreadLocal<Session>(); private HibernateUtil() {} static { sessionFactory = new Configuration().configure().buildSessionFactory(); } // 获取全新的session public static Session openSession() { return sessionFactory.openSession(); } // 获取和线程关联的session public static Session getCurrentSession() { Session session = threadLoacal.get(); // 判断是否得到 if(session==null) { session = sessionFactory.openSession(); // 将session放入threadLocal threadLoacal.set(session); } return session; } public static void closeCurrentSession() { Session session = getCurrentSession(); if(session!=null && session.isOpen()) { session.close(); threadLoacal.set(null); } } // 根据id返回对象的方法 public static Object findById(Class clazz, java.io.Serializable id) { Session session = null; Transaction ts = null; Object obj = null; try { session = openSession(); ts = session.beginTransaction(); obj = session.load(clazz, id); ts.commit(); } catch (Exception e) { if(ts!=null) { ts.rollback(); } e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { if(session!=null && session.isOpen()) { session.close(); } } return obj; } // 根据id返回对象的方法 public static Object findByIdOpenInView(Class clazz, java.io.Serializable id) { Session session = getCurrentSession(); Object obj = session.load(clazz, id); return obj; } // 返回至多一个对象 public static Object uniqueQuery(String hql, String[] paras) { Session session = null; Object obj = null; try { session = openSession(); Query query = session.createQuery(hql); if(paras!=null && paras.length>0) { for(int i=0; i<paras.length; i++) { query.setString(i, paras[i]); } } obj = query.uniqueResult(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { if(session!=null && session.isOpen()) { session.close(); } } return obj; } /// 分页 public static List executeQueryByPage(String hql, String[] paras, int pageSize, int pageNow) { Session session = null; List list = null; try { session = openSession(); Query query = session.createQuery(hql); if(paras!=null && paras.length>0) { for(int i=0; i<paras.length; i++) { query.setString(i, paras[i]); } } /// query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize); list = query.list(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { if(session!=null && session.isOpen()) { session.close(); } } return list; } /// 分页 public static List executeQueryByPageOpenInView(String hql, String[] paras, int pageSize, int pageNow) { Session session = getCurrentSession(); Query query = session.createQuery(hql); if(paras!=null && paras.length>0) { for(int i=0; i<paras.length; i++) { query.setString(i, paras[i]); } } /// query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize); List list = query.list(); return list; } /// 查询接口 public static List executeQuery(String hql, String[] paras) { Session session = null; List list = null; try { session = openSession(); Query query = session.createQuery(hql); if(paras!=null && paras.length>0) { for(int i=0; i<paras.length; i++) { query.setString(i, paras[i]); } } list = query.list(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { if(session!=null && session.isOpen()) { session.close(); } } return list; } /// 查询接口 public static List executeQueryOpenInView(String hql, String[] paras) { Session session = getCurrentSession(); Query query = session.createQuery(hql); if(paras!=null && paras.length>0) { for(int i=0; i<paras.length; i++) { query.setString(i, paras[i]); } } List list = query.list(); return list; } /// 修改和删除 批量sql public static void executeUpdate(String hql, String[] paras) { Session session = null; Transaction ts = null; try { session = openSession(); ts = session.beginTransaction(); Query query = session.createQuery(hql); if(paras!=null && paras.length>0) { for(int i=0; i<paras.length; i++) { query.setString(i, paras[i]); } } query.executeUpdate(); ts.commit(); } catch (Exception e) { if(ts!=null) { ts.rollback(); } e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { if(session!=null && session.isOpen()) { session.close(); } } } /// 修改和删除 批量sql public static void executeUpdateOpenInView(String hql, String[] paras) { Session session = getCurrentSession(); Query query = session.createQuery(hql); if(paras!=null && paras.length>0) { for(int i=0; i<paras.length; i++) { query.setString(i, paras[i]); } } query.executeUpdate(); } // 添加 public static void save(Object obj) { Session session = null; Transaction ts = null; try { session = openSession(); ts = session.beginTransaction(); session.save(obj); ts.commit(); } catch (Exception e) { if(ts!=null) { ts.rollback(); } e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { if(session!=null && session.isOpen()) { session.close(); } } } // 添加 public static void saveOpenInView(Object obj) { Session session = getCurrentSession(); session.save(obj); } }
转载请注明原文地址: https://www.6miu.com/read-43872.html

最新回复(0)