2016-03-30 102 views
1

我提示以下错误:在我的Web应用程序:Hibernate的乐观锁定异常

Handling an unexpected exception in webApp: - javax.servlet.error.status_code = 500 - javax.servlet.error.exception_type = class org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException - javax.servlet.error.message = Object of class [domain.entity.common.dataEntity] with identifier [110837262]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [domain.entity.common.dataEntity

我不知道为什么这个错误发生时,它在下面的行中出现。

SpecEntity specTemp = this.persistService.merge(specTemp); 

是否有人可以帮助这里..

回答

5

在这种情况下,HibernateOptimisticLockingFailureException例外,因为当你试图调用mergeentity(specTaskTemp)则表示发生,是由在平均时间已更新另一笔交易。

如果你看SpecEntity类,你必须定义@Version列。这将被hibernate用来检查你正在合并的实体是否比数据库中的实体更旧。

采样流量:

  1. 事务T1载荷具有版本的列值作为
  2. 事务T2加载相同SpecEntity与版本值1
  3. T2 SpecEntity实体使得一些改变这个实体和更新数据库,因此版本值变为2.
  4. 随后T1尝试更新实体。
  5. 休眠检查是否在该实体的版本(即,1)是相同的数据库中的值(其被更新为2)。
  6. 而当它发现不匹配时,它会抛出HibernateOptimisticLockingFailureException

根据你的使用情况,您可以重新从数据库中更新的entity并显示updated data给用户,使用户可以决定下一步做什么。

或者,如果你想继续与在specTaskTemp实体数据的数据库覆盖数据,你可以得到最新的版本从数据库这个实体,它的版本值复制到specTaskTemp实体,然后调用merge通话。

+0

感谢或答复。我想知道的东西如..为什么它扔在GenDataEntity误差GenDataEntity延伸SpecEntity ..会出现这种情况,如果有合并或在SpecEntity同一会话坚持..我们可以跟踪在数据库中通过其ID-110837262陈旧的对象.. – Trin

+0

@Teena不知道如果我可以回答,而不看你的域模型和你的应用程序的流程。现在,既然您知道问题的症结所在,并且可能会发生此异常,则可以启用show_SQL属性,并查看导致问题的确切顺序的事件。 –