延遲加載作為一種提升效率的機制,利弊共存,優(yōu)點是,在查詢中,某些對象可能在查詢之后,不會使用,比如User對象關(guān)聯(lián)了Department對象,在只需要使用User對象的時候,如果不獲取Deaprtment的相關(guān)信息,則不會查詢Deparment對象的內(nèi)容。但是弊端也顯而易見,延遲加載在session關(guān)閉之后會失效,如果延遲加載使用不當,很容出現(xiàn)無法取得對象的情況。
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 //省略實體類和相關(guān)配置
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屬性,則不會進一步發(fā)送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