2016-01-08 48 views
0

從數據庫中刪除對象後出現錯誤。java.lang.IllegalStateException:在刪除對象後,事務處於非活動狀態,HIBERNATE

錯誤是:

java.lang.IllegalStateException: Transaction not active 
    org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:70) 

我有簡單的應用程序。我在啓動時創建了EntityManagerFactory

每次如果我想用數據庫來工作,我創建EntityManager工作結束後,我關閉它是這樣的:

啓動:

EntityManagerFactory emf = ....; 
. 
. 

EntityManager em = emf.createEntityManager(); 
em.getTransaction().begin(); 
try { 
     em.persist(OBJECT TO SAVE); //REALLY NEW OBJECT 
} catch (Exception e) { 
    em.getTransaction().rollback(); 
} 
em.getTransaction().commit(); 
em.close(); 

所以,沒關係,我可以將某些對象保存到D b。

如果我想刪除的項目,我得到一個異常java.lang.IllegalStateException: Transaction not active.

EntityManager em = emf.createEntityManager(); 
em.getTransaction().begin(); 
try { 
     em.remove(OBJECT TO REMOVE); //REALLY EXIST IN DB 
} catch (Exception e) { 
    em.getTransaction().rollback(); 
} 
em.getTransaction().commit(); 
em.close(); 

你能幫助我嗎?我不知道它是什麼....

編輯:我發現谷歌一些代碼,我試了一下:

em.getTransaction().begin(); 
em.remove(em.merge(OBJECT TO REMOVE)); 
em.getTransaction().commit(); 

它爲我工作!

+0

在回滾之前,您必須檢查事務的狀態。 –

+0

@kkkkk謝謝你的答覆,使用em.getTransaction()。isActive()'?檢查狀態。它返回'true' – haegeapo

+0

在刪除對象之前嘗試刷新實體管理器。 –

回答

1

每的Javadoc,entityManager.remove只適用於管實體,如果叫上分離的實體將導致IllegalStateException異常。

所以你的情況你是一個detaced對象上調用em.remove,它是導致IllegalStateException異常和你的catch塊捕獲它,但你不能打印。您可能需要在catch塊中打印堆棧跟蹤,並顯示IllegalStateException。

最後趕上你仍然繼續在異常後提交上rollbacked transacation,這是導致你所看到的例外。

而em.remove(em.merge(object))工作的原因現在應該清楚了。 em.merge會導致從數據庫中提取對象,因此它成爲一個託管實體,並在託管實體結果中調用remove方法成功刪除它。

相關問題