JPA:事务在数据库中提交,但@Version不会递增

时间:2015-02-28 08:01:18

标签: jpa ejb

我在JavaEE应用程序中使用JPA。我有一个持久性实体Stamp,每当我尝试在更新后立即删除一个实体时,我会不断获得OptimisticLockExceptionThe object [domain.Stamp@473f5e6] cannot be merged because it has changed or been deleted since it was last read

虽然版本是在数据库中提交的,但版本号永远不会在对象中增加(它在数据库中),因此任何后续的合并尝试(为了更新或删除)都会触发异常

基本上,情景如下:

  1. 实例化新Stamp s;
  2. em.persist(s);(数据库和对象中的版本均为1)
  3. 更新s;
  4. em.merge(s);(版本在DB中为2,在对象中为1)
  5. em.remove(this.em.merge(s));
  6. 显然,有些事我不明白。尽管数据库提交,为什么对象版本没有更新?

1 个答案:

答案 0 :(得分:2)

您错过了em.merge(s);将返回合并Stamp s实例的事实,无论是s'。因此s'将在步骤4之后保留新版本。在您的方案中,版本字段将/应该等于2)。遗憾的是,对象的原始版本(s)不会反映其过时对象状态中的更改(在数据库中保留)。

之后,您可以使用此s'实例的此版本(Stamp)在步骤5中删除它。注意:步骤5中的第二个em.merge(s)操作不是必需的, as - 如果正确使用了步骤4中merge操作的上一个返回值 - 它保存了先前更新的更改:反映在数据库中,但也反映在对象的状态中(s'

另见: javax.persistence.EntityManager.merge(...)

  

返回:   状态合并到

的托管实例