码迷,mamicode.com
首页 > 其他好文 > 详细

延迟加载

时间:2015-05-27 13:51:50      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

    /**
     * 当加载属性的时候才发出sql语句,这种现象称为类的延迟加载
     * session.load方法产生出来的是一个代理对象,产生的代理类是 classes的子类
     * session.load方法和get方法的区别
     *    1、session.load方法用延迟加载,但是session.get方法不用延迟加载
     *    2、如果主键在数据库中没有对应的值,session.get方法返回的是null,但是不报错
     *                            session.load方法,当得到属性的时候,会报错ObjectNotFountException
     *    3、session.load方法有可能会导致no session的异常,但是session.get方法不会 
     * 在Classes.hbm.xml文件中
     *    <class name="com.itheima10.hibernate.domain.Classes" lazy="false">
     *     如果lazy为false,则延迟加载失效                              
     */
    @Test
    public void testLoad(){
        Session session = sessionFactory.openSession();
        Classes classes = (Classes)session.load(Classes.class, 8L);//没有发出sql语句
        System.out.println(classes.getName());//才发出sql语句
        session.close();
    }
    
    /**
     * 集合的延迟加载
     *    在Classes.hbm.xml文件中,针对
     *        <set name="students" cascade="save-update" inverse="false">
     *    集合的延迟加载,
     *    在set的元素lazy属性为true/默认值
         *    当classes.getStudents()的时候,并没有发出sql语句
         *    当遍历集合的时候发出sql语句,这种现象称为集合的延迟加载
         *在set元素的lazy属性为false
         *    当classes.getStudents()的时候,既查询了classes对象,也查询了students集合
         *当set元素的lazy属性为extra
         *    
     */
    @Test
    public void testCollection_1(){
        Session session = sessionFactory.openSession();
        Classes classes = (Classes)session.get(Classes.class, 1L);
        Set<Student> students = classes.getStudents();//没有发出sql语句
        for (Student student : students) {//发出了
            System.out.println(student.getName());
        }
        session.close();
    }
    
    /**
     * 在set元素的lazy属性为extra  为更进一步的延迟加载
     *   如果students.size(),那么只加载集合的个数,student的信息没有被加载出来
     *   select
                count(sid) 
            from
                Student 
            where
                cid =?
     *     
     */
    @Test
    public void testCollection_2(){
        Session session = sessionFactory.openSession();
        Classes classes = (Classes)session.get(Classes.class, 1L);
        Set<Student> students = classes.getStudents();//没有发出sql语句
        System.out.println(students.size());
        session.close();
    }
    
    /**
     * <many-to-one  lazy="false/no-proxy/proxy"
     *  利用左外连接把classes与student的数据全部加载出来了
     */
    @Test
    public void testManyToOne(){
        Session session = sessionFactory.openSession();
        Student student = (Student)session.get(Student.class, 1L);
        Classes classes = student.getClasses();
        System.out.println(classes.getName());
        session.close();
    }

 

延迟加载

标签:

原文地址:http://www.cnblogs.com/jsnan/p/4533210.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!