• Hhibernate延迟加载


    一、什么是延迟加载?

    延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象访问该对象的属性时才会加载出相应的值。简答来说就是尽可能的减少查询的数据量。简言之,是当在真正需要数据时,才执行Sql语句进行查询。

    二、如何配置延迟加载

    在Hibernate中通过.hbm配置文件中的lazy属性来配置,并且lazy属性出现的位置不同其作用和取值也不同。下面来详细介绍其在不同位置的不同取值和作用。

    延迟加载分类:

     01.类级别的查询策略

     02.一对多和多对多关联的查询策略

     03.多对一关联的查询策略

    ①类级别的查询策略

    类级别可选的加载策略包括立即加载和延迟加载。默认为延迟加载。如果<class>元素的lazy属性为true。表示采用延迟加载;如果lazy属性为false,表示采用立即加载

    以Emp和Dept为例:

    在Dept.hbm.xml中的<Set>元素中添加属性 lazy="false" 表示立即加载

    测试类:

        @Test
        public void oneTest(){
            Dept dept=(Dept)session.load(Dept.class, 1);
            //lazy  true/false  类级别
            System.out.println(dept.getDeptName());

    load()方法在Id属性和getClass(),不去请求数据库,其他属性需请求数据库

    ② 一对多和多对多关联的查询策略

    lazy属性的另一个属性extra 加强延迟加载

    表明采用增强延迟加载策略:在<set>元素配置lazy属性为"extra"。增强延迟加载策略与一般的延迟加载策略(lazy="true")相似。

    区别:这个策略能在进一步的帮我延迟加载这个对象,也就是代理对象的初始化时机。

    关键代码如下:

    复制代码
    复制代码
        @Test
        public void loadDept() {
            // 获取Session对象
            Session session = HibernateUtil.currentSession();
            // 如果通过load方式加载Dept对象
            Dept dept=(Dept)session.load(Dept.class, 12);
            //拿该部门下的员工的人数:也就是集合的大小
            dept.getEmps().size();
            // 关闭session
            HibernateUtil.closeSession();
        }
    复制代码
    复制代码

    输出结果如下:

    ③ 多对一关联的查询策略

    <many-to-one>元素用来设置多对一关联关系。

    lazy属性 默认值为proxy

    proxy:延迟加载

    no-proxy:无代理延迟加载

    false:立即加载

    例子:

    复制代码
    复制代码
         /*
         * 多对一延迟加载
         */
        @Test
        public void manytoTest(){
            Emp emp=(Emp)session.get(Emp.class, 2);
            //获取Dept对象,因为此时的配置文件lazy是proxy,所以是代理对象
            Dept dept=emp.getDept();
            System.out.println(dept.getDeptName());
            
        }
    复制代码
    复制代码

    输出结果:

    无代理延迟对象:

    在<many-to-one>元素中配置lazy属性为no-proxy,表示无代理延迟加载。

    复制代码
    复制代码
    @Test
    public void loadEmp() {
    // 获取Session对象
    Session session = HibernateUtil.currentSession();
    // 如果通过load方式加载Dept对象
    Emp emp=(Emp)session.get(Emp.class, 1);
    
    //获取Dept对象,因为此时的配置文件lazy是proxy,所以是代理对象
    Dept dept=emp.getDept();
    // 关闭session
    HibernateUtil.closeSession();
    }
    复制代码
    复制代码

    此程序在加载的Emp对象dept属性为null,当程序运行到第3行的时候将触发Hibernate执行查询Dept表的select语句,从而加载Dept对象,由此可见,当lazy属性为proxy时,可以延长延迟加载Dept代理对象的时间,而lazy属性为no-proxy时,则可以避免使用由Hibernate提供的Dept代理类实例,是Hibernate对程序提供更加透明的持久化服务。

  • 相关阅读:
    go 字符串转换
    GRU模型结构
    ElasticSearch实战系列八: Filebeat快速入门和使用---图文详解
    H5可视化编辑器(H5 Dooring)
    (转)如何防止Axios对我的请求参数进行编码?
    vue使用element-ui,如何给Label加标签
    vue中$router.push打开新窗口
    (转)webstorm配置svn
    打开gitee.com网站报错
    监控$route无效
  • 原文地址:https://www.cnblogs.com/xiaosedefeng/p/5843138.html
Copyright © 2020-2023  润新知