a different object with the same identifier value was already associated with 异常

本文探讨了在使用Hibernate进行对象持久化处理时,遇到adifferentobjectwiththesameidentifiervalue异常的问题,并通过分析代码,找到了原因在于未正确关闭session导致session中存在重复实体。通过调整代码逻辑,关闭session,成功解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做项目用到hibernate 对数据进行持久化处理,在做对象修改的时候突然跳出a different object with the same identifier value was already associated with the session 异常

本来就是下午 ,头晕晕的,突然来个这错误,那就更晕了,先不管三七二十一,将异常放到谷歌里一搜,

看了很久,找到一个说要进行session.clean()操作,但在那操作,却不清楚,

要知道项目里面用到session的地方很多,但是却给了我一个线索,从异常来看,

大只是说有session中有两个本应该是唯一标识的实体,就是说session中实体有重复,

那么这是怎么重复的呢?在哪里开始session中便有了两个相同实体了呢?

 回想在先前做的也是一个对对象进行修改的操作中,却没有出现这个异常,

于是与之比较,终于发现问题,原来在获得这个要修改的对象时,根据id先获得对象,代码如下:

public WebSite getUpdateWebSite(int webId) {  

 Session session=HibernateSessionFactory.getSession();  

   return (WebSite) session.get(WebSite.class, webId);  }

 

 


将得到的对象经过用户操作进行修改,然后传回action调用业务逻辑层进行 保存修改操作时

代码:

 

 public void updateWebSite(WebSite web) {   

Session session=HibernateSessionFactory.getSession();   

Transaction tr=session.beginTransaction();   

try{   session.update(web);   tr.commit();   }  

 catch(Exception e){   

 tr.rollback();   

 e.printStackTrace();  

 }   finally{   

session.close();  

 }  

}

这时便出现了上面的异常,你仔细观察便发现  ,当我用id获得对象时

是直接用return (WebSite) session.get(WebSite.class, webId);

这时 session并没有关闭,也就是说此时通过session获得的对象仍是持久化的,由于session没有关闭 ,

当我们后来将用户修改后的此对象传入业务层进行持久化操作时,此对象的id ,用户是改变不了的 ,

他通常 放在jsp页面中的一个隐藏域中,所以当再次对他进行修改操作时,

便会出现session中已有一个这样的对象,也就是上面的异常。

知道了这个,那么修改起来就简单了 ,只要把用id获得对象方法中的session关掉就ok了;

public WebSite getUpdateWebSite(int webId) {  

 Session session=HibernateSessionFactory.getSession();  

 WebSite web=(WebSite) session.get(WebSite.class, webId);

  session.close();

  return web;  

}

 

 


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值