getHibernateTemplate().update()异常分析与解决(a different object with the same identifier value was alread)

今天在做声讯项目时,为了实现修改记录的功能,在Dao中调用baseDao的updateObject(Object)方法,结果却在运行时抛出:org.hibernate.NonUniqueObjectException 异常。
    之前huang sir 在上课的时候有提到过,在update时最好用hql的方式直接对数据库进行修改,否则会发生异常。当时还不太相信,持久层的功能之一就是将程序员从繁杂的sql语句中解脱出来,如此强大的hibernate怎么会连跟新的功能都做不好呢?
经过百般google的不起努力之后,终于明白了其中的玄机。

先来看看baseDao中updateObject的实现:
Java代码   收藏代码
  1. public void updateObject(T o) {  
  2.                 getHibernateTemplate().update(o);  
  3.                 getHibernateTemplate().flush();  
  4.         }  
 
可以看出baseDao是通过直接调用hibernate的session.update(Object  object)方法来对数据库进行更新的。而该方法在执行时,如果在session的缓冲区中存在与传入对象object有相同id的PO对象的话,就会抛出org.hibernate.NonUniqueObjectException 异常。

了解了异常的来源,在回头来看项目,要实现的功能情景如下:
   1.在页面单击某条记录的修改按钮;
   2.在Action中返回该记录的信息并显示在页面上供用户进行修改;
   3.用户修改完后单击确定按钮提交到Aciton;
   4.Action对提交的信息通过service调用dao方法进行update操作。
现在我们假设要修改的数据的id为5,在上面1、2步中,id为5的PO(persistent object)对象从数据库中调入session的缓冲区用于前端的展示;当执行4时,Action中的对象是从表单提交上来的VO(value object)对象,它的id也是5,那么在这时执行update方法时,由于在session的缓冲中已经存在了id为5的PO,那么就会抛出org.hibernate.NonUniqueObjectException 异常。

解决办法:
    1。既然是由于缓冲区里存在了相同id的对象导致异常的抛出,那么在update之前清空缓冲区不就行啦,于是将baseDao中updateObject方法修改成如下:
Code代码   收藏代码
  1. public void updateObject(To) {  
  2.                 getHibernateTemplate().clear();  
  3.                 getHibernateTemplate().update(o);  
  4.                 getHibernateTemplate().flush();  
  5.         }  

 

修改后执行果然没有异常抛出,数据也修改成功。

    2。在网上还有一种解决办法,就是使用hibernate3新增的方法,session.merge()。该方法在执行时会先到session缓冲中寻找相应的PO,并将新对象赋值过去。于是修改后的方法变为:

Code代码   收藏代码
  1. public void updateObject(T o) {  
  2.                 getHibernateTemplate().merge(o);  
  3.                 getHibernateTemplate().flush();  
  4.         }  

 

 

 

 

执行后数据也能成功修改。

the end.

参考网页:
http://hi.baidu.com/yuanli_whu/blog/item/ec94d945ed0d0b45500ffec3.html

个人愚见,欢迎指正。

FROM: http://www.misonsoft.com/supesite/html/25/t-625.html

http://excon.iteye.com/blog/1085591

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值