0
我試圖編寫一個小應用程序,它應該提供一個寧靜的界面。這在它自己的作品中與當前的休眠版本相對比較好。休眠:通過JPA承諾MariaDB
當試圖測試,我修改這樣的服務器端代碼:
EntityManager manager = // [...]
manager.getTransaction.begin();
AEntity entity1 = manager.find(AEntity.class, 4711);
entity1.setSomething("whatever");
manager.merge(entity1);
manager.getTransaction.commit();
manager.close();
通常這應該工作。但是,使用JUnit進行測試時不會。
EntityManager manager = // [...]
// insert some test data
Response r1 = target(url).request().put(someAEntityChangeInfo);
assertEquals(200, r1.getStatus());
manager.refresh(mAEntity);
assertEquals("whatever", mAEntity.getSomething()); // was set and commited on server-side
最後斷言失敗說mAEntity
(應更新)包含舊數據。我也不確定這種行爲是否可能是一種競爭條件,因爲一次(但只有一次)斷言是可以的。
如何確保數據在聲明之前真正提交?
使用MariaDB,MariaDB Connector/J,Hibernate 5.0.7和Jersey 2.22.1。
你爲什麼要開始一個事務,在事務中沒有任何事情時調用flush和commit? –
我需要同步EntityManager的「緩存」。對於正常使用,我在服務器端打開一個EntityManager。爲了驗證書面數據,我需要在我的測試中使用第二個EntityManager。在測試端沒有刷新(本身只能在事務中),Entites將用舊數據刷新。至少我是這麼想的。我錯了嗎? –
一個空的事務將不會執行任何操作,並且在提交內部執行flush操作,因此該行也沒有任何價值。沒有「同步」要做(不是L1緩存會「同步」任何東西)。我沒有看到您的帖子中第一筆交易與第二筆交易之間的關係,或者 –