【发布时间】:2015-05-31 18:35:51
【问题描述】:
我有一个名为 user 的实体,它是版本化的:
@Entity
public class User{
...
@Version
private Long version;
还有一个叫做取款,那不是。
在@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
并且对用户的更改被还原,但对撤回的更改没有,这是一个问题。我做错了什么?
【问题讨论】:
-
我没有时间测试它,但试试这个:根本不要使用合并。您的提款已附加,您的用户已附加,因此更改将在交易结束时自动刷新。我假设第一次合并增加了用户的版本,第二次合并尝试再次保存使用状态(因为退出包含用户)
-
你是对的,即使不使用合并,实体也会保存到数据库中。不幸的是,这并没有改变行为,我得到了异常,但提款没有恢复。