首页 > 代码库 > 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(懒加载)属性