2012-10-12 54 views
1

我收集Hibernate使用javassist庫來處理對象的惰性初始化。說我有以下實體(getter/setter方法/註解是截斷):Eclipse調試器顯示Hibernate管理的對象未被懶惰初始化

@Entity 
public class MainEntity { 
    private ComponentEntity comp; 
} 

@Entity 
public class ComponentEntity { 
    private Integer id; 
    private String name; 
} 

現在我把下面的方法:

@Transactional 
public void doSomething() { 
    MainEntity main = this.dao.find(1); 

    // Case A 
    main.getComp().getName(); 
    // Case B 
    String localVariableName = main.getComp().getName(); 
} 

當DAO檢索爲主,comp對象尚未初始化由於延遲初始化。我希望調用Case A後,comp對象將從數據庫中檢索,但基於調試器,所有comp對象屬性顯示爲空。

只有在Case B之後,我將name值保存到localVariableName中,我可以看到localVariableName獲得非空值。

爲什麼Eclipse將我的對象屬性顯示爲null?

+1

這可能有助於http://www.javalobby.org/java/forums/t20533.html – xyz

+2

您的診斷錯誤。 A和B是完全一樣的東西。不管你存儲結果還是不存儲在局部變量中都是無關緊要的。所以如果A不會拋出異常,B不會。由於一切都在事務性方法中,所以不應該有任何異常。 –

+0

它實際上不會引發異常,但在案例A期間整個對象的屬性被初始化爲空。在案例B中,這是它們用來自數據庫的值填充的時間。我會更新這篇文章以清楚說明。 –

回答

8

懶惰初始化的Hibernate管理對象由javassist代理對象管理。因此在Eclipse調試器中,你必須知道在哪裏看。

screenshot of null proxy object with handler.initialized set to false

offer對象是包含其中包含一個稱爲initialized標誌的處理程序對象的代理對象。目前設置爲false

screenshot of proxy object with null props but with hander.initialized set to true and handler.target containing the initialized actual object

Case A後,處理器的initialized標誌現在設置爲truehandler.target對象也發生變化,以反映實際的對象的初始化屬性offer

所以懶惰的初始化按預期工作。

相關問題