我在我的glassfish服務器上有一個奇怪的問題。看看這段代碼:EntityManager不需要的背景提交
userTransaction.begin();
MyEntity entity = new MyEntity(12345);
//setting values..
entityManager.persist(entity);
MyEntity persistedEntity = entityManager.createQuery("SELECT p FROM MyEntity p WHERE p.idpk=12345").getSingleResult();
//...
userTransaction.commit(); //OK => the tuple is in the DB
現在有一個業務問題,事務需要回滾。
即使回滾似乎工作(沒有發生異常或奇怪的日誌輸出),元組已在數據庫中,一直致力於... 要搜索的問題是,我想下面的代碼:
userTransaction.begin();
MyEntity entity = new MyEntity(12345);
//setting values..
entityManager.persist(entity);
//Business problem => rollback
userTransaction.rollback(); //OK => the tuple 12345 is NOT in the DB !
通過此代碼(實體未被檢索),該元組不會被提交給數據庫,這是正確的行爲。讓我們走的更遠:
userTransaction.begin();
MyEntity entity = new MyEntity(12345);
//setting values..
entityManager.persist(entity);
MyEntity persisted = entityManager.find(MyEntity.class, 12345);
//...
//Business problem => rollback
userTransaction.rollback(); //OK => the tuple 12345 is NOT in DB
在最後這種情況下,結果仍然是正確的,也沒有元組提交到數據庫。看起來EntityManager使用查詢檢索實體時會發出一個奇怪的[不需要的]提交... 我也嘗試在另一個表上進行查詢,並且不會導致錯誤的提交(回滾工作)。此外,我試圖在自己的服務器上重現問題,並且沒有任何問題:所有回滾都正常工作。因此,它應該真的是一個服務器配置問題。
有關信息,它是在linux上運行的glassfish v2.1.1。 EntityManager在FlushModeType.AUTO中。
有沒有人有想法?
謝謝&最好的問候!
什麼是您的jpa提供程序? – dcernahoschi
我正在使用OpenJPA 1.2.1 – ctabin
您使用的是哪個數據庫?這個問題的表在兩個數據庫上都有相同的DDL(如果它們不同)? – dcernahoschi