在使用hibernate進行持久化時,有時須要動態的改變對象的加載,好比在編輯頁面裏面lazy=true,而在瀏覽頁面lazy=false,這樣能夠在須要lazy的地方纔進行控制。而配置文件中Lazy屬性是全局控制的,如何處理呢?
當元素或者元 素的lazy屬性爲true時,load() or get() or find()加載這些對象時,Hibernate不會立刻產生任何select語句,只是產生一個Obj代理類實例,只有在session沒有關閉的狀況 下運行Obj.getXxx()時纔會執行select語句從數據庫加載對象,若是沒有運行任何Obj.getXxx()方法,而session已經關 閉,Obj已成遊離狀態,此時再運行Obj.getXxx()方法,Hibernate就會拋出"Could not initialize proxy - the owning Session was closeed"的異常,是說Obj代理類實例沒法被初始化。然而想在Session關閉以前不調用Obj.getXxx()方法而關閉Session之 後又要用,此時只要在Session關閉以前調用Hibernate.initialize(Obj)或者 Hibernate.initialize(Obj.getXxx())便可,net.sf.hibernate.Hibernate類的 initialize()靜態方法用於在Session範圍內顯示初始化代理類實例。
在配置文件裏面能夠用lazy=true,在程序裏面能夠用強制加載的方法Hibernate.initialize(Object proxy) 方法強制加載這樣就至關於動態改變爲lazy=false。
但在使用時須要注意的一點是:其中的proxy是持久對象的關聯對象屬性,好比A實體,你要把A的關聯實體B也檢出,則要寫Hibernate.initialize(a.b)。數據庫