【发布时间】:2015-02-18 16:21:15
【问题描述】:
在 JBOSS 7.1 AS 中,我使用的是容器管理事务。对于每个请求,我都会进行几次实体更新。大多数实体使用 EntityManager 中的“插入、合并、刷新”方法来管理更新。但是,有一个实体使用显式查询在数据库上执行“executeUpdate”(参见下面的代码 sn-p)。此 sql 更新立即提交到数据库,并且与容器管理的事务(如其他实体更新)不一致。无论如何,是否将显式 sql 更新(下面的更新)与容器管理的事务对齐?我正试图让回滚工作并且这个 sql 更新没有被回滚。除了这个之外,所有其他实体更新和插入都工作正常。感谢您的所有帮助。
代码sn-p:
entityManager.createQuery
( "UPDATE Balance a SET a.balanceValue = :newValue WHERE a.balanceId =:balanceId AND a.balanceValue = :currentValue" ) .setParameter("balanceId", cb.getBalanceId()) .setParameter("currentValue", cb.getBalanceValue()).setParameter("newValue", newAmt).executeUpdate();
附加代码:(下面的代码使用 Bean 管理的事务,但 CMT 的行为也相同)
ut.begin();
ChargingBalance bal2 = entityManager.find(ChargingBalance.class, 13);
bal2.setResetValue((new Date()).getTime());
String UPDATE_BALANCE_AND_EXPIRYDATE_EQUAL = "UPDATE ChargingBalanceValue a"
+ " SET a.balanceValue = :newValue "
+ " WHERE a.balanceId = :balanceId";
Query query = entityManager.createQuery(UPDATE_BALANCE_AND_EXPIRYDATE_EQUAL)
.setParameter("balanceId", 33)
.setParameter("newValue", 1000l);
/*The executeUpdate command gets committed to DB before ut.commit is executed */
query.executeUpdate();
/* This below only commits changes on ResetValue */
ut.commit();
ut.begin();
ChargingBalance bal = entityManager.find(ChargingBalance.class, 23);
bal.setResetValue(1011l);
query = entityManager.createQuery(UPDATE_BALANCE_AND_EXPIRYDATE_EQUAL)
.setParameter("balanceId", 33)
.setParameter("newValue", 2000l);
query.executeUpdate();
/* This rollback doesn't rollback changes executed by executeUpdate, but it rollbacks ResetValue change */
ut.rollback();
【问题讨论】:
-
也尝试添加一些相关代码,“我做了几个实体更新。大多数实体使用“插入、合并、刷新”,由此不清楚您如何更新实体以及您如何得出大多数实体使用插入、合并、刷新等。
-
使用哪个 JPA 实现?
-
我添加了一些额外的代码。我正在使用 JPA 2.0 的 Hibernate 实现。 org.hibernate:hibernate-entitymanager:4.2.7.SP1
-
任何帮助将不胜感激。我在这个问题上停留了一段时间。
标签: jpa jboss7.x entitymanager ejb-3.1 jta