2015-05-04 37 views
0

我有一個從數據庫讀取數據的服務。閱讀後有一個衝突,導致標題中提到的例外。以下是陳述的序列只讀服務:javax.persistence.TransactionRequiredException:沒有事務正在進行中

ManagerFactory factory = new ManagerFactory(); 
    EntityManager manager = factory.getManager(); 
    EntityTransaction transaction = manager.getTransaction(); 

    Query query = manager.createQuery("select personRoleJPA from personRoleJPA"); 
    personRoleJPA = (PersonRoleJPA) query.getSingleResult(); 

    if (manager.isOpen()) { 
     manager.flush(); 
    } 
    if (manager.isOpen()) { 
     manager.close(); 
     manager = null; 
    } 
    if (transaction.isActive()) { 
    transaction.commit(); 
    } 

我懷疑這個例外是因爲我沒有開始交易。 我的問題是你真的需要刷新&提交時,你沒有做任何寫道?

+0

不,它不需要刷新,並承諾當你不寫任何東西 – Nimesh

+0

刪除所有與交易相關的線,你將擺脫的問題 –

+0

的@侯賽因扎瓦維:
關於commit()你也可以從閱讀:你的意思是我甚至不需要創建一個事務'EntityTransaction transaction = manager.getTransaction();' ? – Nancy

回答

1

,因爲你不需要主動交易來獲取數據刪除與交易相關的一切:

ManagerFactory factory = new ManagerFactory(); 
    EntityManager manager = factory.getManager(); 

    Query query = manager.createQuery("select personRoleJPA from personRoleJPA"); 
    personRoleJPA = (PersonRoleJPA) query.getSingleResult(); 

    if (manager.isOpen()) { 
     manager.flush(); 
    } 
    if (manager.isOpen()) { 
     manager.close(); 
     manager = null; 
    } 
+0

當我不寫任何東西時,是否需要開始交易? – Nancy

+0

是的,當你調用Transaction.begin()時,你不能調用一個非活動事務的提交,事務就會被激活。@ Sandra –

0

關於flush()方法,你可以從文檔閱讀:http://docs.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html#flush%28%29
如果從數據庫中讀取任何你不需要transaction.commit()commit()用於在執行sql語句後保存更改,但在select語句中不需要commit。默認JDBC提交是自動提交模式。在休眠配置文件中,您可以更改此設置。最佳做法是禁用自動提交模式。 https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

相關問題