2011-09-21 55 views
2

我有一個導致一些悲傷的org.hibernate.envers.entities.mapper.relation.lazy.proxy.ListProxy實例:每當我以編程方式嘗試訪問它時,我得到一個空指針異常(即調用list.size()),但是當我第一次檢查使用Eclipse的變量檢查器的對象我看到Hibernate生成一條SQL語句並且列表動態地改變。然後一切正常。我怎樣才能以編程方式做同樣的事情?我試過list.toString()但這似乎沒有幫助。eclipse在檢查變量時做什麼(調試時)

更新1

不知道如果這有助於但是當我第一次點擊列表實例我在顯示屏看到:

com.sun.jdi.InvocationException occurred invoking method. 

然後數據庫查詢運行,當我再次點擊我得到正確的.toString()結果。

更新2

原來這裏是例外,我得到(當我不檢查調試模式下的元素)。

java.lang.NullPointerException 
    at org.hibernate.envers.query.impl.EntitiesAtRevisionQuery.list(EntitiesAtRevisionQuery.java:72) 
    at org.hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:104) 
    at org.hibernate.envers.entities.mapper.relation.OneToOneNotOwningMapper.mapToEntityFromMap(OneToOneNotOwningMapper.java:74) 
    at org.hibernate.envers.entities.mapper.MultiPropertyMapper.mapToEntityFromMap(MultiPropertyMapper.java:118) 
    at org.hibernate.envers.entities.EntityInstantiator.createInstanceFromVersionsEntity(EntityInstantiator.java:93) 
    at org.hibernate.envers.entities.mapper.relation.component.MiddleRelatedComponentMapper.mapToObjectFromFullMap(MiddleRelatedComponentMapper.java:44) 
    at org.hibernate.envers.entities.mapper.relation.lazy.initializor.ListCollectionInitializor.addToCollection(ListCollectionInitializor.java:67) 
    at org.hibernate.envers.entities.mapper.relation.lazy.initializor.ListCollectionInitializor.addToCollection(ListCollectionInitializor.java:39) 
    at org.hibernate.envers.entities.mapper.relation.lazy.initializor.AbstractCollectionInitializor.initialize(AbstractCollectionInitializor.java:67) 
    at org.hibernate.envers.entities.mapper.relation.lazy.proxy.CollectionProxy.checkInit(CollectionProxy.java:50) 
    at org.hibernate.envers.entities.mapper.relation.lazy.proxy.CollectionProxy.size(CollectionProxy.java:55) 
    at <MY CODE HERE, which checks list.size()> 

(臨時黑客其實更多)最終解決

boolean worked = false; 
while (!worked) { 
    try { 
     if(list.size() == 1) { 
      // do stuff 
     } 
     worked = true; 
    } catch (Exception e) { 
     // TODO: exception must be accessed or the loop will be infinite 
     e.getStackTrace(); 
    } 
} 

回答

4

那麼什麼happends有你seing Hibernate的延遲加載在深行動:)

基本上冬眠負荷代理類爲您提供了懶惰的關聯關係,例如,您可以爲您的C類獲得一個Hibernate自動生成代理的List(實際上是一個PersistenceBag實現),而不是C類列表。這是hibernate延遲加載關聯值的方式,直到它們實際被訪問。所以這就是爲什麼當你在eclipse調試器(基本上通過自省訪問實例的字段/方法)訪問它時,你會看到sql hibernate觸發器獲取所需的數據。

這裏的訣竅是,根據何時訪問懶惰集合,您可能會得到不同的結果。如果你使用eclipse調試器來訪問它,你更有可能仍然在開始加載這個東西的Hibernate會話中,所以一切都按預期工作,當訪問這個東西並且加載數據時,一個sql被(懶惰地)觸發。問題是,如果你想在你的代碼中訪問相同的數據,但是在會話已經關閉的時候,你會得到一個LazyInitializationException或null(後者如果你使用某個庫來清理put hibenrate proxises作爲Gilead)

+0

失敗的代碼(拋出異常)是正確的,我有我的斷點設置,所以顯然會話仍然有效嗎?不同之處在於,如果我跨越下一行,它會爆炸,但是如果我使用Eclipse進行檢查,那麼可以跨越下一行。 –

+1

我認爲當eclipse調試器訪問文件時也會出現這個錯誤,這就是它只是由Eclipse繼承而來。當你不使用eclipse進行調試/切換時,你得到的確切錯誤是什麼? –

+0

好點,沒有想到......我會附加例外原始問題。 –

相關問題