我有一個奇怪的Hibernate用例,在更大的堆棧中進行調用時,需要未經修改的作爲休眠事務一部分的對象的副本。然而,每次我向Hibernate詢問對象的副本時,它都會返回已經被修改/成爲事務一部分的版本。在事務中繞過休眠緩存
有沒有辦法讓我強制Hibernate返回有問題的對象的數據庫副本/無緩存版本?
我有一個奇怪的Hibernate用例,在更大的堆棧中進行調用時,需要未經修改的作爲休眠事務一部分的對象的副本。然而,每次我向Hibernate詢問對象的副本時,它都會返回已經被修改/成爲事務一部分的版本。在事務中繞過休眠緩存
有沒有辦法讓我強制Hibernate返回有問題的對象的數據庫副本/無緩存版本?
打開新的Session
並從新的Session
中獲取對象的副本。從基礎數據庫
Session#refresh(Object object);
重新讀取該給定實例的狀態。
或者您可以撥打session.evict(obj)
(將其從會話緩存中刪除)並重新調用load()
。
請注意,如果您使用EntityManager
而不是Session
,則不會有evict()
方法。您可以獲取Session
這樣:
Session session = (Session) entityManager.getDelegate();
如果你不關心休眠緩存,使用無狀態會話執行查詢。 Google Hibernate無狀態會話獲取詳細信息。
如果會話打開/關閉委託給框架(如spring),那麼打開一個新會話可能會很麻煩。一般而言,爲這個問題打開和關閉會話有點像用火箭筒殺死蒼蠅:) – Bozho 2009-12-29 18:12:25
會話應該是輕量級的。如果你想要一個新的對象,打開一個會話並獲取它。會話工廠是重量級的,並且應該始終可以通過一些框架API使用,以便在需要時(例如這種需要)。 – yfeldblum 2009-12-29 20:06:20