刷新 UserTransaction 中的实体管理器时出现 TransactionRequiredException
TransactionRequiredException when flushing entity manager inside a UserTransaction
我有一个接受 POST 请求的 servlet,我正在尝试使用请求的参数来构建和保留实体实例 class。
这是我的 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。但是映射到实体 class 的 table 仍然是空的。
如果我删除 flush()
调用,我不会得到异常,但仍然选择了序列值并且在 table.
中没有插入任何内容
我正在使用 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>
可能是什么问题?
看来我只需要在方法中添加@Transactional 注释。
我有一个接受 POST 请求的 servlet,我正在尝试使用请求的参数来构建和保留实体实例 class。
这是我的 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。但是映射到实体 class 的 table 仍然是空的。
如果我删除 flush()
调用,我不会得到异常,但仍然选择了序列值并且在 table.
我正在使用 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>
可能是什么问题?
看来我只需要在方法中添加@Transactional 注释。