延迟加载作为一种提升效率的机制,利弊共存,优点是,在查询中,某些对象可能在查询之后,不会使用,比如User对象关联了Department对象,在只需要使用User对象的时候,如果不获取Deaprtment的相关信息,则不会查询Deparment对象的内容。但是弊端也显而易见,延迟加载在session关闭之后会失效,如果延迟加载使用不当,很容出现无法取得对象的情况。
1 package demo;
2
3 import org.hibernate.Session;
4 import org.junit.Test;
5
6 import domain.Student;
7 import util.HibernateUtil;
8
9 public class App
10 {
11 //省略实体类和相关配置
12 @Test
13 public void lazyLoad() {
14 Session session = null;
15 try {
16 session = HibernateUtil.openSession();
17 session.beginTransaction();
18
19 //s对象在load完毕之后是一个托管对象,只有一个id属性,如果不使用该对象,则不会进行查询
20 //但是,不论是否能够查询到,s对象不是空,是一个含有id的代理对象
21 Student s = (Student) session.load(Student.class, 99);
22 //System.out.println(s.getId());
23
24 //get方法不存在延迟加载机制,会直接查询,但是查询不到会返回null
25 //而不是一个代理对象
26 Student s1 = (Student) session.get(Student.class, 5);
27 System.out.println(s1);
28
29 //取得s2对象之后,若不进一步取得s2所包含的department属性,则不会进一步发送sql去
30 //取得department的信息
31 Student s2 = (Student) session.load(Student.class, 10);
32 //System.out.println(s2.getDepartment().getName());
33
34 session.getTransaction().commit();
35
36 } catch (Exception e) {
37 if (session != null) {
38 session.getTransaction().rollback();
39 }
40 } finally{
41 if (session != null) {
42 session.close();
43 }
44 }
45 }
46
47 }
48
49