當使用session中的load方法查詢資料庫中的記錄時,我們返回的是乙個**物件,而不是真正需要的那個物件;例如資料庫中存有個student表,我們有cn.binyulan.doman.student的領域物件,如果查詢id值為「200626313」的studentstu =(student)session.load(student.class,"200626313"),然後我們列印system.out.println(stu.getclass);得到的結果為cn.binyulan.domain.student$$enhancerbycglib$$5a7cc325,名字很奇怪吧,這個物件是hibernate幫我們生成的,從名字可以看出它是對student類的增強類的物件,其實這就是個**物件,這個物件裡並沒有我們需要的student的資料,所以如果你在session關閉後在使用stu來獲取資訊,如stu.getname();就會出現如下異常:org.hibernate.lazyinitializationexcept
ion:could not initialize proxy - no session,這就說明了stu中沒有我們需要的資料了。
stu物件現在到底是什麼呢,它其實是乙個**類,這個類具有查詢資料庫的能力,當session沒有關閉的時候如果我們呼叫stu.getname()方法;那麼這個類會去查詢資料庫並返回相應的資料。之後我們關閉session之後再去使用這個類就不會有異常了,可是我們如果呼叫stu.getname()只是為了讓**類去查資料庫,如果別人看我們的**時候覺得這兩句在邏輯上根本就沒有用,別人就很容易注釋掉,一注釋掉就又會出現異常了,所以hibernate提供了乙個方法hibernate.initialize(stu);這樣就可以初始化這個**物件了。
不知道大家注意到沒有,上面的那句**student stu =(student)session.load(student.class,"200626313")把stu強制轉化為student型別,有人會問:不是返回的是**物件麼,那怎麼又強制轉換成student了呢,其實**類是student的子類,它具有了比父類更強的能力(資料庫查詢),這個類是怎麼生成的呢?其實hibernate使用了asm.jar和cglig-2.1.3.jar,在記憶體中修改student類的位元組碼,修改後的位元組碼只要符合class檔案的規則,就可以建立出**物件。
domain物件不應該final的,大家現在應該明白為什麼了吧,如果是final的,那麼就不可以繼承,當然也就不可以產生**物件,也就不能實現懶載入了,如果你不用懶載入,那麼把domain物件設計成fianl的也是可以的。
hibernate的懶載入
所以想讓乙個物件為非延時載入有兩種方法 第一種就是讓該物件訪問它的乙個屬性 第二種呼叫hinbernate.initialize 物件名 懶載入時候應注意的問題 1 懶載入的物件不能是final的,因為懶載入時hinbernate會自動生成乙個繼承自源物件的 物件,如果源物件是final的就不能被繼...
Hibernate懶載入策略
hibernate懶載入策略 概念 lazy的概念就是只有在真正使用物件時,才會去建立。對hibernate而言,就是真正載入時才發出載入sql語句。延遲載入機制是為了避免一些無謂的效能開銷而提出來的。重點牢記 1.load支援延遲載入,get不支援延遲載入。2.lazy的生命週期與session相...
hibernate懶載入原理
懶載入的意思是查詢的時候不會立刻訪問資料庫,而返回的是 物件,當真正去使用物件欄位的時候才會訪問資料庫。load object,serializable 前提實體類不能是final的。根據id查詢 查詢返回的是 物件,不會立刻訪問資料庫,是懶載入的。當真正去使用物件的時候才會訪問資料庫。用load的...