2016-02-08 151 views
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。

+0

你爲什麼要開始一個事務,在事務中沒有任何事情時調用flush和commit? –

+0

我需要同步EntityManager的「緩存」。對於正常使用,我在服務器端打開一個EntityManager。爲了驗證書面數據,我需要在我的測試中使用第二個EntityManager。在測試端沒有刷新(本身只能在事務中),Entites將用舊數據刷新。至少我是這麼想的。我錯了嗎? –

+1

一個空的事務將不會執行任何操作,並且在提交內部執行flush操作,因此該行也沒有任何價值。沒有「同步」要做(不是L1緩存會「同步」任何東西)。我沒有看到您的帖子中第一筆交易與第二筆交易之間的關係,或者 –

回答

0

該問題似乎是刷新事務和連接隔離的混合。

要解決此問題:

  • 設置沖洗方式提交:manager.setFlushMode(FlushModeType.COMMIT);測試
  • 設置連接隔離READ_COMMITED使得測試連接能夠看到通過測試的代碼所做的更改另一個EntityManager。爲了生產更高的隔離度,我會更好。 JPA-property:<property name="hibernate.connection.isolation" value="2" />

還有hibernate的autocommit屬性。設置爲false以保持對行爲的更多控制。