【问题标题】:JPA @Version and transaction rollbackJPA @Version 和事务回滚
【发布时间】: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

并且对用户的更改被还原,但对撤回的更改没有,这是一个问题。我做错了什么?

【问题讨论】:

  • 我没有时间测试它,但试试这个:根本不要使用合并。您的提款已附加,您的用户已附加,因此更改将在交易结束时自动刷新。我假设第一次合并增加了用户的版本,第二次合并尝试再次保存使用状态(因为退出包含用户)
  • 你是对的,即使不使用合并,实体也会保存到数据库中。不幸的是,这并没有改变行为,我得到了异常,但提款没有恢复。

标签: java jpa version rollback


【解决方案1】:

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

【讨论】:

  • 我的数据库是 PostgreSQL 9.3,据我了解应该是事务性的。我的应用程序在 JBoss 7.1 上运行,这是来自 persistence.xml 的属性: 提款对象是托管实体,并通过类型化查询与 EntityManager 一起加载: List tracking= entityManager.createQuery("select d from Withdrawal w where w.status = :wtatus", Withdrawal.class).setParameter("status ", Withdrawal.Status.NEW).getResultList();
猜你喜欢
  • 2015-10-25
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 2018-08-07
  • 2011-09-22
  • 1970-01-01
  • 2014-11-12
相关资源
最近更新 更多