首页 > 代码库 > 019 关联映射文件中集合标签中的lazy(懒加载)属性

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();

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