a different object with the same identifier value was already associated with the session:

来源:互联网 发布:淘宝网佛经早晚课读本 编辑:程序博客网 时间:2024/06/05 06:07

异常描述

相信大多数对hibernate还不是很熟悉的人都遇到过这个错误,这个错误翻译过来就是:

不同对象具有相同的标识符值已经与会话关联起来,为什么会这样呢,因为我们对一个前台传过来的对象,准确的说是前台表单传过来的表单元素(系统很自动将这些表单元素的值根据该表单元素的name属性一对象的属性名对应然后封装在一个对象里面),这个时候我们的这个对象可能已经有id了,这个时候我们要对这个对象执行更新操作,好我们直接调用update方法然后更新这个对象,之后操作成功,没问题,但是如果你前台表单元素不是和给对象的属性一一对应(前台表单无法把这个对象所关联对象给传过来),这个时候会出现数据丢失的现象,即你update会把之前这个对象的一些前台表单没有传过来的属性的值覆盖,即丢失了数据,但我们为了不想丢失数据,我们可能会在前台用一个隐藏表单传过来这个对象关联对象的id,然后执行update操作的时候根据隐藏表单传过来的关联对象的id,然后从数据库中查询这个关联对象,查出来后把这个对象设置给要update的那个对象,然后调用service的update,前台给你报500错误,后台抛异常a different object with the same identifier value was already associated with the session:

解决方法

我们可以在执行update操作的时候,不直接更新(可能会丢失数据,当然如果这个对象没有关联对象,或者该对象属性全是基本数据类型的情况我们直接更新没问题),也不通过id查询关联对象,然后设置的方法(会报异常),我们的做法是通过系统给我们封装好的这个要更新的对象的id(我们在前台通过隐藏表单传过来,系统就会把这个id封装到参数对象里面)查询数据库,然后把用户修改的属性从新设置给我们查询出来的对象(修改的值从参数对象里面取),然后更新我们查询出来的对象,而不是更新参数对象(后台方法参数)

ok问题解决,当然也许还有其他更简单的方法,以后发现了补上

1 0