在UserTransaction中刷新实体管理器时发生TransactionRequiredException

时间:2018-03-08 19:12:13

标签: java hibernate java-ee jta jboss-eap-7

我有一个接受POST请求的servlet,我试图使用请求的参数来构建和持久化实体类的实例。

这是我的servlet:

public class TheServlet extends HttpServlet {
    @PersistenceContext(unitName="unit1")
    private EntityManager entityManager;
    @Resource
    private UserTransaction utx;

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws IOException {
        // parse request parameters
        // ...

        // create and persist object based on the parameters
        createInstance(parsedParameters);
    }

    private Long createInstance(ParsedParams initData) {
        MyObj instance = new MyObj(initData);

        try {
            utx.begin();
            entityManager.persist(instance);
            entityManager.flush(instance);
            utx.commit();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return instance.getId();
    }
}

这是日志中的例外:

Caused by: javax.persistence.TransactionRequiredException: no transaction is in progress
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1136)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1297)
    at org.jboss.as.jpa.container.AbstractEntityManager.flush(AbstractEntityManager.java:459)
    at org.mypackagename.TheServlet.createInstance(TheServlet.java:122)
    ... 44 more

在异常之前,我在日志中看到了这一点:

19:50:10,222 INFO  [stdout] (default task-2) Hibernate: 
19:50:10,223 INFO  [stdout] (default task-2)     select
19:50:10,223 INFO  [stdout] (default task-2)         MY_OBJ_SEQ.nextval 
19:50:10,223 INFO  [stdout] (default task-2)     from
19:50:10,223 INFO  [stdout] (default task-2)         dual

如果我签入数据库,确实已经使用了序列的nextval。但是映射到实体类的表仍然是空的。 如果我删除了flush()来电,我就不会收到异常,但仍会选择序列值,并且表中不会插入任何内容。

我使用JBoss EAP 7并且已将数据源的jta属性设置为true。

这是我的persistence.xml文件:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
  version="2.1">

  <persistence-unit name="unit1" transaction-type="JTA">
    <jta-data-source>java:jboss/OracleDS</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"/>
      <property name="hibernate.show_sql" value="true" />
      <property name="hibernate.format_sql" value="true" />
      <property name="hibernate.hbm2ddl.auto" value="validate" />
    </properties>
  </persistence-unit>
</persistence>

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

似乎我只需要在方法中添加@Transactional注释。