Hibernat异常Row was updated or deleted by another transaction _JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Hibernat异常Row was updated or deleted by another transaction

Hibernat异常Row was updated or deleted by another transaction

 2011/9/29 8:03:01  fantasy0407  http://fantasy0407.iteye.com  我要评论(0)
  • 摘要:Couldnotsynchronizedatabasestatewithsessionorg.hibernate.StaleObjectStateException:Rowwasupdatedordeletedbyanothertransaction(orunsaved-valuemappingwasincorrect):[com.introns.model.goods.NetGoods#402880d31fa720c1011fa72605690001]说明操作的对象应用了乐观锁
  • 标签:not

Could not synchronize database state with session

org.hibernate.StaleObjectStateException:

Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.introns.model.goods.NetGoods#402880d31fa720c1011fa72605690001]

说明操作的对象应用了乐观锁;version

错误原因:当在进行操作时,当前version版本与DB中version版本不一致;

???????????? A:另外有人对此记录进行了相似操作;

???????????? B:自己操作有误:?

?????????????例如通过编辑页面来修改一条记录时:传回来的form对象中version为空,然后又指导些form中的值copy到相应的实体对象中;--此时此实体对象中的version也为空;当update时,version不一致就会出错;

???????? 解决:???? A:用form传数据时,把version也传\过来;

????????????????????? B:从DB中把version查出来,赋给实体对象;再更新;


Row was updated or deleted by another transaction
timestamp的字段一定要有值,并且是日期值,否则当hibernate更新这个字段没有值的那条记录时,会出现如下错误

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.test.admin.domain.user#1]

当选择assigned生成器时,除非有一个version或timestamp属性,或者你定义了 Interceptor.isUnsaved(),否则需要让Hiberante使用 unsaved-value="undefined",强制Hibernatet查询数据库来确定一个实例是瞬时的(transient) 还是脱管的(detached)。

<timestamp name="lastUpdate" column="user_lastupdate" generated="never" />

never指不从数据库中产生。

Hibernate 疑难异常及处理

1、a different object with the same identifier value was already associated with the session。

  错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。

  解决方法一:session.clean()

PS:如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出"Found two representations of same collection"异常。

  解决方法二:session.refresh(object)

PS:当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下。

  解决方法三:session.merge(object)

PS:Hibernate里面自带的方法,推荐使用。

2、Found two representations of same collection

  错误原因:见1。

  解决方法:session.merge(object)

以上两中异常经常出现在一对多映射和多对多映射中

?

发表评论
用户名: 匿名