2009-12-29 43 views
1

我有一個奇怪的Hibernate用例,在更大的堆棧中進行調用時,需要未經修改的作爲休眠事務一部分的對象的副本。然而,每次我向Hibernate詢問對象的副本時,它都會返回已經被修改/成爲事務一部分的版本。在事務中繞過休眠緩存

有沒有辦法讓我強制Hibernate返回有問題的對象的數據庫副本/無緩存版本?

回答

3

打開新的Session並從新的Session中獲取對象的副本。從基礎數據庫

+0

如果會話打開/關閉委託給框架(如spring),那麼打開一個新會話可能會很麻煩。一般而言,爲這個問題打開和關閉會話有點像用火箭筒殺死蒼蠅:) – Bozho 2009-12-29 18:12:25

+2

會話應該是輕量級的。如果你想要一個新的對象,打開一個會話並獲取它。會話工廠是重量級的,並且應該始終可以通過一些框架API使用,以便在需要時(例如這種需要)。 – yfeldblum 2009-12-29 20:06:20

3
Session#refresh(Object object); 

重新讀取該給定實例的狀態。

或者您可以撥打session.evict(obj)(將其從會話緩存中刪除)並重新調用load()

請注意,如果您使用EntityManager而不是Session,則不會有evict()方法。您可以獲取Session這樣:

Session session = (Session) entityManager.getDelegate(); 
0

如果你不關心休眠緩存,使用無狀態會話執行查詢。 Google Hibernate無狀態會話獲取詳細信息。