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

异常描述

相信大多数对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问题解决,当然也许还有其他更简单的方法,以后发现了补上
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值