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

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ADreamClusive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值