只读服务:javax.persistence.TransactionRequiredException:没有正在进行的事务

时间:2015-05-04 12:46:49

标签: java hibernate

我有一个从数据库中读取数据的服务。读完后会有一个刷新,导致标题中提到的异常。以下是陈述序列

    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();
   }

我怀疑异常是因为我没有开始交易。 我的问题是你真的需要冲洗吗?当你没有做任何写作时提交?

2 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:0)

关于flush()方法,您可以阅读文档:http://docs.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html#flush%28%29
如果您从数据库中读取任何内容,则不需要transaction.commit()commit()用于在执行sql语句后保存更改,但在select语句中,您不需要commitJDBC中的默认值commit是自动提交模式。在hibernate配置文件中,您可以更改此设置。最佳做法是禁用自动提交模式。
关于commit(),您还可以阅读:https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html