2009-07-16 32 views
2

我遇到了從查詢返回的Hibernate對象不可靠的情況。不可靠的休眠對象

考慮下面的代碼:

MyClass myClass = myDAO.get(id); 

myClass.getId(); //This works 
myClass.getName(); //This returns null sometimes, and works sometimes 

這裏是我的GET方法:

@SuppressWarnings("unchecked") 
public T get(ID id) 
{ 
    Session s = getSession(); 
    T entity = (T) s.load(getPersistentClass(), id); 
    s.disconnect(); 
    return entity; 
} 

現在,我明白,這個對象是一個代理,並會偷懶裝,但我希望它要麼永遠工作,要麼永遠不工作。我在這裏做錯了什麼?

回答

3

這可能是也可能不是原因,但你可能不應該使用Session.load(),你應該使用Session.get()

load()返回hibernate當前加載的持久化實例,根據之前發生的情況,這可能會部分填充。

get()更健壯。試試看。

+0

load()用於性能方面的原因(根據Hibernate團隊的建議)。我會給get()一個鏡頭,但是我仍然期望hibernate在獲取它時請求成員... – Jesse 2009-07-16 15:18:23

+1

我有類似的問題,如果使用load的時候不是相同的問題,我改成get()並且所有的都很好) – jottos 2009-07-16 15:47:59

1

問題是「負載」將加載對象的代理,而不是實際命中數據庫。但是,如果對象已經被加載(並填充),即在1級緩存中,則它將提供該實例。

當你使用加載時,它只會在絕對必要的時候實際命中數據庫,也就是當你詢問對象的某個字段時。

獲取另一方面將實際上擊中數據庫。

出於您的目的,我會建議您是否使用加載或讓它在傳回之前確保對象已填充。在你把它傳回去之前,請打電話給其中一個獲得者。那麼你可以保證它被填充。

一個有用的練習是啓用sql日誌記錄(org.hibernate.SQL = DEBUG),通過它進行調試並查看正在執行的SQL指令。

你也可以考慮配置你正在加載的持久化對象是非惰性的。這樣,無論您使用load還是get,都會每次都獲得完全填充的對象。