再次犯了沒有仔細看Hibernate Reference的錯誤在Hibernate 以上版本都支持對於property設置 lazy=true但一直我都以為只要設置了就可以實現的今天和jindw討論的時候才知道原來不是這樣 ^_^趕快做了下試驗確實即使對於property設置了lazy=true但在調用獲取了po中的任意非主鍵 屬性時其他所有的property也就被加載了也就是說lazy沒有生效到底怎麼回事呢翻閱Hibernate Reference才明白了這個問題
property
()lazy (可選默認為false) 指定實例變量第一次被訪問時這個屬性是否延遲抓取(需要運行時字 節碼增強)
其實看這部分會在最後那句需要運行時字節碼增強上迷糊在hibernate reference中還有一句這樣的 話Hibernate也不需要使用任何編譯期處理比如字節碼增強操作它獨立的使用Java反射機制和運 行時類增強(通過CGLIB)
這就非常迷糊了因為這裡已經說了比如字節碼增強操作
不過還好在Hibernate Reference中有個專門的章節來解釋property lazy的問題這個章節就是使用 延遲屬性抓取在這裡才算是完全看明白了
屬性的延遲載入要求在其代碼構建時加入二進制指令如果你的持久類代碼中未含有這些指令 Hibernate將會忽略這些屬性的延遲設置仍然將其直接載入
看完這段就明白了也就是說要在編譯期對代碼進行字節碼增強關於編譯期進行字節碼增強的實現 具體見Hibernate Reference裡面列出了一個采用ant task完成編譯時字節碼增強的實現
想明白後懷疑是不是Hibernate Reference中文版中翻譯錯了?寫的應該是需要編譯時字節碼增強吧 果然查閱了一下Hibernate Reference英文版上面寫的就是requires buildtime bytecode instrumentation
不過Hibernate Reference中文版中component部分的lazy翻譯的又是對的那裡的翻譯就是需要編譯 時字節碼增強^_^
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28278.html