JPA @Version和事务回滚

时间:2015-03-27 12:22:44

标签: java jpa version rollback

我有一个名为user的实体,版本化了:

@Entity
public class User{
...
@Version
private Long version;

和另一个名为Withdrawal,不是。

在@Singleton类的定期@Transactional方法中,我尝试根据用户执行的提款更新用户:

for(Withdrawal withdrawal : withdrawals ) {
    User user= entityManager.find(User.class, withdrawal.getUser().getId());
    user.setFunds(user.getFunds() - withdrawal .getFunds());
    entityManager.merge(user);
    withdrawal.setStatus(Withdrawal.Status.OK);
    entityManager.merge(withdrawal);
}

如果我在阅读后更改了用户的版本,但在合并之前,我会得到一个例外:

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction

用户的更改将被还原,但撤消的更改不会,这是一个问题。我做错了什么?

1 个答案:

答案 0 :(得分:0)

可能有很多可能的原因。 您的数据库是否是事务性的,您是否在数据库和应用程序中都启用了事务? 你如何获得提款对象?他们是管理实体吗?