标签:
/** * 当加载属性的时候才发出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