做项目用到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;
}