2015-05-04 91 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

相关问题