zoukankan      html  css  js  c++  java
  • 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对程序提供更加透明的持久化服务。

  • 相关阅读:
    Neko's loop HDU-6444(网络赛1007)
    Parameters
    SETLOCAL
    RD / RMDIR Command
    devenv 命令用法
    Cannot determine the location of the VS Common Tools folder.
    'DEVENV' is not recognized as an internal or external command,
    How to change Visual Studio default environment setting
    error signing assembly unknown error
    What is the Xcopy Command?:
  • 原文地址:https://www.cnblogs.com/xiaosedefeng/p/5843138.html
Copyright © 2011-2022 走看看