解决a different object with the same identifier value was already associated with the session错误...

问题场景:

  (我要做对象修改,然后保存进数据库)

  我通过数据库获取一个原对象obj;

  然后新增了一个修改对象obj1;

  然后将obj1.setId(obj.getId());

  然后调用数据库实例对象SESSION.UPDATE(OBJ1); 

      数据库报错,抛出了异常a different object with the same identifier value was already associated with the session。

 

  原因就是session再检测实例化对象时,发现obj和obj1的ID相同(通过地址去检测),导致抛出异常,根据以下解决方法:

  buildDevelopers_tDAO.getSessionFactory().getCurrentSession().merge(buildDev_t_after);

  即 使用MERGE()方法,而不是使用update()方法;  

  

  另外一种解决方法:

  不要使用set()方法去赋ID;

  obj = obj1;

  obj.setName()

  .....(根据相应的修改,去进行赋值)

  然后调用数据库实例对象SESSION.UPDATE(OBJ1);

  即不要使用set方法赋ID即可。

 

解决方案:

1、a different object with the same identifier value was already associated with the session。

  错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。

  解决方法一:session.clean()

  PS:如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出"Found two representations of same collection"异常。

  解决方法二:session.refresh(object)

  PS:当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下。

  解决方法三:session.merge(object)

  PS:Hibernate里面自带的方法,推荐使用。

2、Found two representations of same collection

  错误原因:见1。

  解决方法:session.merge(object)

    以上两中异常经常出现在一对多映射和多对多映射中

3、问题情况:使用hibernate来进行对对象的保存操作时,出现了exception,导致数据保存不成功,具体报错如是:

Exception in thread "main" org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:

使用情况(本人遇到):如果是在保存对象的时候,如果对象有外键,则在保存的时候,要根据外键来获取数据库所对应的记录的对象,之后再set入要保存的的对象中,如果是直接new一个外键的对象(外键的值在数据库有对应的值)再set入保存的对象中的时候,就会报错:Exception in thread "main" org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:,这个是因为,在保存的时候,session会检查在内存的外简单的对象跟你new的对象是否一样(不是根据对象的值,而是根据在内存的地址是否一致来比较的),所以new出来的对象是无法跟内存里面的对象一致的,因而,会说不同的对象有一样的id,所以保存数据库的时候就直接根据外键来获取对应的数据库记录来保存对象,所以这个时候用merge方法还是解决不了问题的。

最后是在查了一下,采用session.merge (object c)代替session.save(object c),即可解决,主要涉及到session.merge ()方法的使用以及session.merge ()跟session.save()、session.update ()方法的区别,这篇博文详细说明了问题....

该方法将修改表中记录,其所需要的实体状态为脱管状态,但是注意,它并不影响调用方法前后的状态,也即该实体依然是脱管状,见例6.4。

例6.4:session.merge ()方法对状态的变化

     public void run() {

          //创建UserInfo实例

          UserInfo userInfo = new UserInfo();

          //使之成为脱管状态

          userInfo.setId(11112);

          userInfo.setName("RW3");

          userInfo.setSex("M");

          //创建UserInfo实例

          UserInfo userInfo2 = new UserInfo();

          //使之成为脱管状态

          userInfo2.setId(11112);

          userInfo2.setName("RW4");

          userInfo2.setSex("F");

          //启动Session

          Session session = HibernateSessionFactory.currentSession();

          //启动事务

          Transaction tx = session.beginTransaction();

          //调用merge方法,此时UserInfo实体状态并没有被持久化

          session.merge(userInfo);

          //调用merge方法,此时UserInfo实体状态并没有被持久化

          //但是数据库中的记录被更新了

          ①session.merge(userInfo2);

          //merge方法与update方法的差别在于针对同样的操作update方法会报错

          //原因在于update方法使得实体状态成为了持久化状态,而Session中不允许两个持久化实体有同样的持久化标识

          ②//session.update(userInfo);

          //session.update(userInfo2);

         //以下两句不会发送SQL,因为userInfo2不是持久化状态的实体

         ③userInfo2.setName("RW5");

          userInfo2.setSex("M");

          //提交事务

          tx.commit();

          //关闭Hibernate Session

          HibernateSessionFactory.closeSession();

     }

针对该段代码将执行如下SQL语句:

Hibernate:

/* ①session.merge(userInfo2)的动作 */

select

        userinfo0_.id as id0_0_,

        userinfo0_.NAME as NAME0_0_,

        userinfo0_.SEX as SEX0_0_,

        userinfo0_.roomid as roomid0_0_

    from

        userinfo userinfo0_

    where

        userinfo0_.id=?

Hibernate:

/* ①session.merge(userInfo2)的动作 */

update

            userinfo

        set

            NAME=?,

            SEX=?,

            roomid=?

        where

            id=?

session.merge()方法会首先发送一句select语句,去数据库端获取UserInfo持久化标识所对应的表记录;然后自动生成一个持久化状态的UserInfo实体,与脱管状态的UserInfo实体做比较是否有所改变;一旦发生了改变,才会发送update语句执行更新。而按执行顺序,若两句session.merge()方法针对同一个脱管状态的UserInfo实体,那其结果只会执行最后一个session.merge()方法所发出的update语句。即使执行了session.merge()方法,UserInfo实体依然是脱管状态,因此③userInfo2. setName("RW5")的语句不会同步数据库中的表。

转载于:https://www.cnblogs.com/UUUz/p/9930292.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网产业104页深度研究报告:物联网研究框架与投资机会分析

报告出品方:国信证券作者:马成龙、付晓钦、陈彤1物联网是未来五年甚至十年的大赛道1.1 物联网:下一代网络网络革命的本质是连接主体和连接方式的变化:第一代互联网(PC互联网)是计算机与计算机之间的联网&am…

随笔:朋友圈扫街图有感(爱情)

#声明:照片来自我的一位甘姓友人,并非本人所拍。但为之感动,尤其震撼。 皮夹里老照片上恰风华正茂的少年,但如今一双褶皱的手,缓缓掏出过了时的纸币,无疑岁月蹉跎,当年的Ta早已成了耄耋老人。说…

浅谈SDN架构下的运维工作

导读目前国内的网络运维还处于初级阶段,工作人员每天就像救火一样,天天疲于奔命。运维人员只能埋头查找系统运行的日志,耗时耗力,老眼昏花不说,有时候忙了半天还一无所获,作为运维工程师的你,有…

华为自动驾驶实车实路测试视频曝光!徐直军:比特斯拉好多了

资料来源:量子位、物联网智库等整理发布:物联网智库 昨日(4月15日),消息称配备华为自动驾驶技术的北汽新能源极狐阿尔法S的HI版车型在上海进行了公开试乘,这也是华为自动驾驶技术公开试乘的全球首秀。以下视…

Pycharm社区版运行Django的三种方法(Pycharm添加配置参数快捷启动Django、Pycharm社区版Django项目创建)

目录Pycharm社区版运行Django的三种方法Django安装和环境变量的配置(MacOS)创建Project启动Django Webserver方法一:终端启动方法二:pycharm项目界面启动方法三:pycharm社区版实现直接启动Pycharm社区版运行Django的三…

日本机器人全球领先来自这三大顶尖技术

来源:工业机器人▍日本尖端技术之一:机器人精密减速机世界上工业机器人使用的精密减速机几乎都为日本所垄断。尽管国内也量产的RV减速机,但国产机器人企业却鲜有选用的,原因是日本精密减速机技术遥遥领先,短期很难替代…

仰望星空后,更将脚踏实地!

仰望星空后,更将脚踏实地!

在目标检测中如何解决小目标的问题?

作者:Nabil MADALI来源:AI公园编译:ronghuaiyang在深度学习目标检测中,特别是人脸检测中,由于分辨率低、图像模糊、信息少、噪声多,小目标和小人脸的检测一直是一个实用和常见的难点问题。然而,…

html利用js生成excel表格(html表格标签生成excel)table2excel实例:一表格多sheets

table2excel实例 使用插件&#xff1a;table2excel.js简介&#xff1a;table2excel 可以转换和下载html上的表格&#xff0c;使他成为.xlsx格式&#xff0c;能够被Excel打开 实例代码 <head><!--js文件在文章末尾--><script src"table2excel.js">…

python学习之路day02

一、.pyc是什么&#xff1f; 1. Python是一门解释型语言&#xff1f; 我初学Python时&#xff0c;听到的关于Python的第一句话就是&#xff0c;Python是一门解释性语言&#xff0c;我就这样一直相信下去&#xff0c;直到发现了*.pyc文件的存在。如果是解释型语言&#xff0c;那…

像人一样自然流畅地说话,下一代智能对话系统还有多长的路要走?

来源&#xff1a;机器之心机器之心编辑部作为人工智能的一个子领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;指的是机器理解并解释人类书面语和口语的能力&#xff0c;目的在于使计算机像人类一样智能地理解语言和用语言表达&#xff0c;弥补人类交流&#xff08;自…

机器学习:简单的随机梯度下降(SGD)求解回归问题和用逻辑回归(LR)解决分类问题

20210405作业&#xff1a; 回归问题: 用随机梯度下降法实现&#xff0c;数据用data.csv。分类问题: 用梯度下降实现逻辑回归&#xff0c;可以用批量梯度也可以用随机梯度实现。数据采用西瓜数据3.0α.csv。 1. SGD (Stochastic gradient descent) # 导包 import numpy as np i…

849. 到最近的人的最大距离

在一排座位&#xff08; seats&#xff09;中&#xff0c;1 代表有人坐在座位上&#xff0c;0 代表座位上是空的。 至少有一个空座位&#xff0c;且至少有一人坐在座位上。 亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。 返回他到离他最近的人的最…

Nature『大脑废物清除系统』已上线,从“痴呆”变聪明或成可能

来源&#xff1a;生物通 利用早发性阿尔茨海默氏症的小鼠模型&#xff0c;研究人员移除了一组小鼠大脑中的一些淋巴管。他们给这些小鼠以及对照组注射了单克隆抗体疗法&#xff0c;包括小鼠版本的Aducanumab。对小鼠大脑的研究显示&#xff0c;脑膜淋巴系统(紫色和粉红色)可以…

Unity3D_(API)Quaternion四元数中的Quaternion.LookRotation()

四元数百度百科&#xff1a;  传送门 四元数官方文档&#xff1a;  传送门 欧拉旋转、四元数、矩阵旋转之间的差异&#xff1a;  传送门 四元数转换为欧拉角eulerAngles  官方文档&#xff1a;  传送门 欧拉角转换为四元数Euler  官方文档&#xff1a;  传送门 Q…

思考:那么些大学生仅凭个人好恶来判断,缺乏是非观

“一切仅凭自己的好恶来判断&#xff0c;是缺乏是非观的体现” 今读某大学Z教授&#xff08;一位授课严谨认真的老师&#xff0c;在我心中&#xff0c;至少我是这样认为的&#xff09;的推文&#xff0c;深受触动。文章小中见大&#xff0c;批判了精致的利己主义思想&#xff0…

工业互联网的十大关键传感器

来源&#xff1a;传感器专家网工业互联网(Industrial Internet)是制造业一大热潮。从早期GE提出工业互联网理念被不少人解读为美国的制造业复兴战略&#xff0c;到GE的Predix平台受到热捧&#xff0c;再到西门子推出工业互联网平台Mindsphere&#xff0c;及多家本土的制造业巨头…

抽奖系统的流量削峰方案

如果观看抽奖或秒杀系统的请求监控曲线&#xff0c;你就会发现这类系统在活动开放的时间段内会出现一个波峰&#xff0c;而在活动未开放时&#xff0c;系统的请求量、机器负载一般都是比较平稳的。为了节省机器资源&#xff0c;我们不可能时时都提供最大化的资源能力来支持短时…

SVM支持向量机-手写笔记(超详细:拉格朗日乘数法、KKT条件、对偶性质、最优化、合页损失、核函数...)

SVM支持向量机-手写笔记 作者&#xff1a;某丁 日期&#xff1a;2021.05.21 写完了&#xff0c;发现想要真正理解SVM还需要继续深入学习&#xff0c;以上所写只不过是冰山一角&#xff0c;我的管中窥豹而已。 参考 [1] 一文搞懂支持向量机(SVM)算法 https://zhuanlan.zhihu.co…

扛鼎之作!Twitter 图机器学习大牛发表160页论文:以几何学视角统一深度学习

来源&#xff1a;AI科技评论作者&#xff1a;Michael Bronstein编译&#xff1a;Mr Bear、青暮导语&#xff1a;近日&#xff0c;帝国理工学院教授、Twitter 首席科学家 Michael Bronstein 发表了一篇长达160页的论文&#xff08;或者说书籍&#xff09;&#xff0c;试图从对称…