再次犯了沒有仔細(xì)看Hibernate Reference的錯(cuò)誤,在Hibernate 3以上版本都支持對(duì)于property設(shè)置lazy="true",但一直我都以為只要設(shè)置了就可以實(shí)現(xiàn)的,今天和jindw討論的時(shí)候才知道原來不是這樣,^_^,趕快做了下試驗(yàn),確實(shí),即使對(duì)于property設(shè)置了lazy="true",但在調(diào)用獲取了po中的任意非主鍵屬性時(shí)其他所有的property也就被加載了,也就是說lazy沒有生效,到底怎么回事呢,翻閱Hibernate Reference才明白了這個(gè)問題:
property
(7)lazy (可選,默認(rèn)為false) 指定實(shí)例變量第一次被訪問時(shí),這個(gè)屬性是否延遲抓取(需要運(yùn)行時(shí)字節(jié)碼增強(qiáng))
其實(shí)看這部分會(huì)在最后那句需要運(yùn)行時(shí)字節(jié)碼增強(qiáng)上迷糊,在hibernate reference中還有一句這樣的話:“Hibernate也不需要使用任何編譯期處理,比如字節(jié)碼增強(qiáng)操作,它獨(dú)立的使用Java反射機(jī)制和運(yùn)行時(shí)類增強(qiáng)(通過CGLIB)。”
?這就非常迷糊了,因?yàn)檫@里已經(jīng)說了比如字節(jié)碼增強(qiáng)操作....
不過還好在Hibernate Reference中有個(gè)專門的章節(jié)來解釋property lazy的問題,這個(gè)章節(jié)就是使用延遲屬性抓取,在這里才算是完全看明白了:
“屬性的延遲載入要求在其代碼構(gòu)建時(shí)加入二進(jìn)制指令,如果你的持久類代碼中未含有這些指令,Hibernate將會(huì)忽略這些屬性的延遲設(shè)置,仍然將其直接載入。”
看完這段就明白了,也就是說要在編譯期對(duì)代碼進(jìn)行字節(jié)碼增強(qiáng),關(guān)于編譯期進(jìn)行字節(jié)碼增強(qiáng)的實(shí)現(xiàn)具體見Hibernate Reference,里面列出了一個(gè)采用ant task完成編譯時(shí)字節(jié)碼增強(qiáng)的實(shí)現(xiàn)。
想明白后懷疑是不是Hibernate Reference中文版中翻譯錯(cuò)了?寫的應(yīng)該是需要編譯時(shí)字節(jié)碼增強(qiáng)吧,果然,查閱了一下Hibernate Reference英文版,上面寫的就是requires build-time bytecode instrumentation...
不過Hibernate Reference中文版中component部分的lazy翻譯的又是對(duì)的,那里的翻譯就是需要編譯時(shí)字節(jié)碼增強(qiáng),^_^