019 关联映射文件中集合标签中的lazy(懒加载)属性

<set><list>集合上,可以取值:true/false/extra,(默认值为:true)

实例一:(集合上的lazy=true(默认))class默认lazy=true(默认)

session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            //不会发出SQL语句
            Classes classes = (Classes)session.load(Classes.class, 1);
            //发出SQL语句,因为在使用对象
            System.out.println("classes.name=" + classes.getName());

           
            //不会发SQL语句,只会返回一个代理类,因为没有使用对象
            Set<Student> students = classes.getStudents();       
            //会发出SQL语句,因为使用了对象
            for (Iterator<Student> iter = students.iterator();iter.hasNext();){
               Student student = iter.next();
                System.out.println(student.getName());
            }         
            //提交事务

            tx.commit();

 

实例二:集合上的lazy=true(默认)class已经设置懒加载,class默认lazy=true(默认)

session = HibernateUtils.getSession();

            tx = session.beginTransaction();
            //不会发出SQL语句
            Classes classes = (Classes)session.load(Classes.class, 1);
            //发出SQL语句,因为在使用对象
           System.out.println("classes.name=" + classes.getName());        
            //不会发SQL语句,只会返回一个代理类,因为没有使用对象
            Set<Student> students = classes.getStudents();         
            //会发出SQL语句,发出查询全部数据的SQL,效率不高
            System.out.println("student.count=" + students.size());         
            //提交事务

            tx.commit();

 

实例三:集合上的lazy=false,其它保持默认class默认lazy=true(默认)

          //不会发出SQL语句,因为只设置了集合上的lazy为false,其它保持默认
            Classes classes = (Classes)session.load(Classes.class, 1);
            //发出两条SQL语句,分别加载classes和student
            //并且把集合中的数据也加载上来(虽然并没有使用集合中的对象),因为设置了集合的lazy=false

            System.out.println("classes.name=" + classes.getName());         
            //不会发SQL语句,因为已经在前面加载了数据

            Set<Student> students = classes.getStudents();       
            for (Iterator<Student> iter = students.iterator();iter.hasNext();){

                Student student = iter.next();

                System.out.println(student.getName());

            }

 

实例四:集合上的lazy=false,其它保持默认class默认lazy=true(默认)

//不会发出SQL语句

        Classes classes = (Classes)session.load(Classes.class, 1);
        //发出两条SQL语句,分别加载classes和student
        //并且把集合中的数据也加载上来(虽然并没有使用集合中的对象),因为设置了集合的lazy=false
        System.out.println("classes.name=" + classes.getName());       
        //不会发SQL语句,因为已经在前面加载了数据
        Set<Student> students = classes.getStudents();       
        //不会发SQL语句,因为已经在前面加载了数据
        System.out.println("student.count=" + students.size());

 

 

实例五:设置集合上lazy=extra,其它默认class默认lazy=true(默认)

session = HibernateUtils.getSession();

            tx = session.beginTransaction();
            //不会发出SQL语句
            Classes classes = (Classes)session.load(Classes.class, 1);
            ////发出两条SQL语句
            System.out.println("classes.name=" + classes.getName());
         
            //不会发出SQL语句,只返回代理类
            Set<Student> students = classes.getStudents();          
            //会发出SQL语句
            for (Iterator<Student> iter = students.iterator();iter.hasNext();){
                Student student = iter.next();
                System.out.println(student.getName());
            }          
            //提交事务
            tx.commit();

 

实例六:设置集合上lazy=extra,其它默认class默认lazy=true(默认)

session = HibernateUtils.getSession();
        tx = session.beginTransaction()
        //不会发出SQL语句
        Classes classes = (Classes)session.load(Classes.class, 1);
        //发出两条SQL语句
        System.out.println("classes.name=" + classes.getName());     
        //不会发出SQL语句,只返回代理类
        Set<Student> students = classes.getStudents();    
        //发出SQL语句,发出一条比较智能的SQL语句(select count(id) form t_student where classesid=?)

//和lazy=true相比,效率高       

System.out.println("student.count=" + students.size());

       
        //提交事务

        tx.commit();

 

posted @ 2014-11-06 17:16  crazyYong  阅读(410)  评论(0编辑  收藏  举报