2010-02-17 84 views
1

我正在寫測試,看看我的getHibernateTemplate().delete(x)是否有效。 現在我發現在單個測試中似乎有一些緩存(我的測試類擴展延伸至AbstractTransactionalDataSourceSpringContextTests)。春季hibernatetemplate:刪除緩存?

我的意思是以下內容。 我的刪除功能:

它存在嗎?
是:刪除它並返回true
否:返回false。

現在我試着在我的測試函數中做兩個斷言。
第一個是assertTrue來檢查它是否真的被刪除
第二個是assertFalse,看它是否正確返回false。

但是我的第二個測試失敗了,當我調試它時,它確實轉到了真正的部分。

但是,如果我添加以下行getHibernateTemplate().find("from classX"); 作爲刪除功能中的第一行,它將按預期工作。儘管我對價值無所作爲。所以緩存問題似乎是最合乎邏輯的。

有沒有人有任何建議,因爲留在那裏的行似乎有點骯髒。

+0

只是一個小小的一面注意:HibernateTemplate自Spring2以來有點不推薦使用了。檢查http://www.kimchy.org/hibernate_vs_spring_hibernate_template/ – fasseg

+0

@ smeg4brains:HibernateTemplate在原始Hibernate上的選擇是一種個性化和風格化的選擇。我仍然喜歡使用'HibernateTemplate',我認爲API更好。這絕對不會被廢棄,只是現在你可以選擇不使用它。 – skaffman

+0

@skaffman:絕對正確。這就是爲什麼我使用措辭「有點不贊成」:)但你說得對,這無疑是開發者的選擇。 – fasseg

回答

1

我目前在我的電腦上沒有圖書館,所以我不能告訴你確切的代碼,但我認爲你需要分離會話。

getSharedEntityManager().flush(); //it's something like this 
getSharedEntityManager().clear(); 

這將清除交易並開始新的交易,以便您可以做出更好的假設。我發現你正在擴展的測試套件與緩存有一些非常奇怪的不一致,所以它不僅僅是你。

0

只是一個想法,你可能會失敗的事實是,所有調用getHibernateTemplate()。dosomething()的事件都發生在同一事務中。由於AbstractTransactionalDataSourceSpringContextTests,在生產中導致兩次事務的測試在單元測試中的同一事務中結束之前,我遇到了問題。

這導致實體已經與第二次調用中的休眠會話相關聯,這可以提供關於可能發生什麼的指針。

但是我看了這一段已經有一段時間了,所以我可能會在這裏留下很深的印記。

+0

是的,它在同一個交易中。 感謝您和jboy的帖子,我找到了答案。 在我的測試中的endTransaction()可以做到這一點。 – user211992