2011-06-10 58 views
0

當我構建一個Hibernate查詢後Hibernate的好習慣,我的代碼去如下:分離對象

@SuppressWarnings("unchecked") 
List<SendCommands> list = query.list(); 
session.evict(list); 
if(list.isEmpty()) 
    return null; 
SendCommands dst = list.get(0); 
return dst; 

什麼是這個例子中,「良好」習慣:

1)分離(驅逐)整個結果集,然後返回該組的第一個目的,或

2)分離(驅逐)只一組的第一個對象:

@SuppressWarnings("unchecked") 
List<SendCommands> list = query.list(); 
if (list.isEmpty()) 
    return null; 
SendCommands dst = list.get(0); 
session.evict(dst); 
return dst; 
+0

你想達到什麼目的?爲什麼你需要分離物體? – axtavt 2011-06-10 13:01:23

+0

我需要分離對象以將它們傳遞到另一個圖層。根據文檔,交易結束時對象會丟失,爲什麼我想分離它們。 – iliaden 2011-06-10 13:03:20

回答

2

您不需要分離對象。 Hibernate實體是POJO,在事務結束時不會丟失。會話關閉時,會自動分離。但是你仍然可以使用它並訪問它們的數據,除非數據被標記爲延遲加載並且在實體連接時沒有被提取。

+0

謝謝!你能告訴我會發生什麼,如果它有一個延遲加載字段,並且會話被關閉。這個字段會變成空指針嗎?或者Hibernate會拋出異常? 另外:如果我不分離一個對象,返回它,並在其他地方(同一會話,不同的線程)更新它。返回的值會改變嗎? – iliaden 2011-06-10 13:36:07

+0

你會得到一個LazyInitializationException。你的第二個問題沒有意義,因爲你不應該在不同的線程中使用同一個會話。會話是單線程的。這個基本的,但是使用Hibernate時非常重要的東西。你應該明確地重申hibernate參考文檔,這裏描述了所有這些:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single – 2011-06-10 13:47:47