a different object with the same identifier 解决办法

将update方法该为merge方法

 

顺便讲下:

hibernate的各种保存方式的区别 (save,persist,update,saveOrUpdte,merge,flush,lock)等

 

hibernate的保存
hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别:
一、预备知识:
在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient、persistent、detached
下边是常见的翻译办法:
transient:瞬态或者自由态
persistent:持久化状态
detached:脱管状态或者游离态

脱管状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。
持久化实例可以通过调用 delete()变成脱管状态。通过get()或load()方法得到的实例都是持久化状态的。
脱管状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。

save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,
而update()或merge()会引发SQLUPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,
它也会引起SQLUPDATE。saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE

二、save 和update区别
把这一对放在第一位的原因是因为这一对是最常用的。
save的作用是把一个新的对象保存
update是把一个脱管状态的对象保存

三,update 和saveOrUpdate区别
这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和update
引用hibernate reference中的一段话来解释他们的使用场合和区别
通常下面的场景会使用update()或saveOrUpdate():
程序在第一个session中加载对象
该对象被传递到表现层
对象发生了一些改动
该对象被返回到业务逻辑层
程序调用第二个session的update()方法持久这些改动

saveOrUpdate()做下面的事:
如果对象已经在本session中持久化了,不做任何事
如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常
如果对象没有持久化标识(identifier)属性,对其调用save()
如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()
如果对象是附带版本信息的(通过<version>或<timestamp>) 并且版本属性的值表明其是一个新实例化的对象,save()它。
否则update() 这个对象

四,persist和save区别
这个是最迷离的一对,表面上看起来使用哪个都行,在hibernate reference文档中也没有明确的区分他们.
这里给出一个明确的区分。(可以跟进src看一下,虽然实现步骤类似,但是还是有细微的差别)
这里参考http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682 中的一个说明:
---------------------------------------------------------------------------------
I found that a lot of people have the same doubt. To help to solve this issue
I'm quoting Christian Bauer:
"In case anybody finds this thread...

persist() is well defined. It makes a transient instance persistent. However,
it doesn't guarantee that the identifier value will be assigned to the persistent
instance immediately, the assignment might happen at flush time. The spec doesn't say
that, which is the problem I have with persist().

persist() also guarantees that it will not execute an INSERT statement if it is
called outside of transaction boundaries. This is useful in long-running conversations
with an extended Session/persistence context.A method like persist() is required.

save() does not guarantee the same, it returns an identifier, and if an INSERT
has to be executed to get the identifier (e.g. "identity" generator, not "sequence"),
this INSERT happens immediately, no matter if you are inside or outside of a transaction. This is not good in a long-running conversation with an extended Session/persistence context."

---------------------------------------------------------------------------------
简单翻译一下上边的句子的主要内容:
1,persist把一个瞬态的实例持久化,但是并"不保证"标识符被立刻填入到持久化实例中,标识符的填入可能被推迟
到flush的时间。

2,persist"保证",当它在一个transaction外部被调用的时候并不触发一个Sql Insert,这个功能是很有用的,
当我们通过继承Session/persistence context来封装一个长会话流程的时候,一个persist这样的函数是需要的。

3,save"不保证"第2条,它要返回标识符,所以它会立即执行Sql insert,不管是不是在transaction内部还是外部


五,saveOrUpdateCopy,merge和update区别
首先说明merge是用来代替saveOrUpdateCopy的,这个详细见这里
http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html
然后比较update和merge
update的作用上边说了,这里说一下merge的
如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例
如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例,最后返回该持久实例
用户给出的这个对象没有被关联到session上,它依旧是脱管的
重点是最后一句:
当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态
但当我们使用merge的时候,执行完成,我们提供的对象A还是脱管状态,hibernate或者new了一个B,或者检索到
一个持久对象B,并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态

六,flush和update区别
这两个的区别好理解
update操作的是在脱管状态的对象
而flush是操作的在持久状态的对象。
默认情况下,一个持久状态的对象是不需要update的,只要你更改了对象的值,等待hibernate flush就自动
保存到数据库了。hibernate flush发生再几种情况下:
1,调用某些查询的时候
2,transaction commit的时候
3,手动调用flush的时候

七,lock和update区别
update是把一个已经更改过的脱管状态的对象变成持久状态
lock是把一个没有更改过的脱管状态的对象变成持久状态
对应更改一个记录的内容,两个的操作不同:
update的操作步骤是:
(1)更改脱管的对象->调用update
lock的操作步骤是:
(2)调用lock把对象从脱管状态变成持久状态-->更改持久状态的对象的内容-->等待flush或者手动flush

浊音/清音/爆破音的时域及频域特性 第一周作业 浊音/清音/爆破音的时域及频域特性 思路:使用Audacity进行录制,时域部分将音频放大观察波形规律,频域部分生成并进行频谱分析。 (1)浊音U 时域分析: 时域表现为短周期性,波形比较规律。 频域分析: 频域上表现为频率集中在低频区域,共振峰较为明显,短时能量较高。 (2)清音S 时域分析: 时域波形没有周期性,整体振幅小于浊音。 频域分析: 频域波形平缓,无共振峰,能量比较集中。 (3)爆破音t 时域分析: 脉冲波,更为尖锐,整体上振幅降低。 频域分析: 没有像浊音一样的共振 阅读详情

相关推荐

从NASA DataPort下载到PyTorch Dataset:手把手处理USGS光谱库的AVIRIS数据

本文详细介绍了如何从NASA DataPort下载USGS光谱库的AVIRIS高光谱数据,并将其转化为PyTorch Dataset对象。内容涵盖数据获取、预处理、辐射定标及高效数据加载技巧,特别针对AVIRIS数据的水吸收波段剔除和波段分组标准化进行了重点讲解,为环境监测、地质勘探等领域的研究者提供实用指南。

weixin_30607659的博客 281

hibernate的各种保存方式的区别 (save,persis,update,saveOrUpdte,merge等)

hibernate的各种保存方式的区别 (save,persis,update,saveOrUpdte,merge,flush,lock)等 hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别: 一、预备知识: 在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient、persistent、detached 下边是常见的翻译办法...

dreamstone 713

MMdetection3D与MMdetection版本匹配全攻略:从安装到测试一步到位

本文详细解析了MMdetection3D与MMdetection版本匹配的关键问题,提供了从环境配置到测试验证的完整指南。针对常见的安装错误,文章强调了版本依赖链(PyTorch、MMCV、MMDetection、MMDetection3D)精确对齐的重要性,并给出了基于CUDA 11.3等环境的实战版本组合与避坑方案,帮助用户高效部署3D目标检测开发环境。

xgboost6farmer的博客 238

hibernate中 persist() 和 merge()的区别是什么?

persist()和merge()都是JPA中的方法,用于将一个新的或已存在的实体对象持久化到数据库中。

Wangfuqiangqiang的博客 1436

HWSD全球土壤数据下载处理

下载地址: http://www.fao.org/soils-portal/soil-survey/soil-maps-and-databases/harmonized-world-soil-database-v12/en/

江北20190411的博客 3万+

3D视觉实战之双目相机物体尺寸实时测量

视差图滤波能够将稀疏视差转变为稠密视差,并在一定程度上降低视差图噪声,改善视差图的视觉效果,但是比较依赖初始视差图的质量。的目标是获得左右两个相机的内参、外参和畸变系数,其中内参包括左右相机的fx,fy,cx,cy,外参包括左相机相对于右相机的旋转矩阵和平移向量,畸变系数包括径向畸变系数(k1, k2,k3)和切向畸变系数(p1,p2)以及其他一些畸变类型。:相比于昂贵的专业设备,便宜的双目摄像头可以显著降低成本,使得实时点云生成技术更加普及和经济实惠。

qq_53545309的博客 2098

Hibernate方法save、update、merge、saveOrUpdate及get和load的区别

在看这几个方法区别之前,有必要了解hibernate实体对象的三种状态,点击查看 http://www.cnblogs.com/Y-S-X/p/8345754.html 一、update 和 merge的区别 首先在执行更新操作的时候,两者都必须要有id update是直接执行update 语句,执行后状态为持久化状态 而merge则不一样: 1. 如果session中有与之对应的对象,...

weixin_34001430的博客 334

windows下宝塔安装教程

windows下宝塔安装教程 目录宝塔是什么?宝塔安装流程1.下载2.配置3.登录4.安装的环境套件小结 宝塔是什么? 宝塔是管理服务器的免费的软件,宝塔上面可以进行对你的服务器批量进行管理,对于运维人员来说还是必不可少的一个软件,值得使用。 宝塔安装流程 1.下载 链接: https://download.bt.cn/win/panel/BtSoft.zip 下载后安装买最好自定义目录,方便找 2.配置 下载完成后会出现这个页面,对着页面进行配置 点击默认密码复制进来,这里注意一点就是一定要查看

你在看屏幕的同时,屏幕也在注视着你 4422

浅谈hibernate save ,update 和 saveOrUpdate的区别

最近由于工作的需要使用批量插入数据,如果使用SQL语句构造,有两种方式:1、一个一个执行,2、构造很长的SQL语句然后一次性执行 先来说一下这种方式的缺点:1、构造SQL语句麻烦,容易出现问题,如果表字段过多,SQL语句很长,2、无论是一次性还是多长执行都会花费很长的时间 建议:如果使用这种方式最好不要使用String 构造SQL语句,在可控范围内可以这样使用,如果数据量很大,最好不要这样做。

5354

将Keil中的变量数组导出

首先,写好导出数据的函数。

小柚子的博客 1951

SO_KEEPALIVE、TCP_KEEPIDLE、TCP_KEEPINTVL、保活包

是一个套接字选项,用于设置是否启用 keepalive 机制。在这段代码中没有涉及到选项的设置。当被设置为非零值时,表示启用 keepalive 机制。keepalive 是一种用于检测连接是否仍然有效的机制。通过定期发送一些特定的探测数据,可以检测到网络连接的异常中断或对端应用程序的崩溃退出。为了避免以上情况,可以启用 keepalive 机制,即使在无数据传输的情况下也定期发送探测数据。如果在一定时间内没有收到对端的响应,就认为连接已经失效,并进行相应的处理。要启用选项,需要使用函数。其中,fd。

m0_46376834的博客 4815

Hibernate 三种状态的区分,以及save,update,saveOrUpdate,merge等的使用

(1)当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该po状态就处 于detached, (表示和session脱离关联),因delete而变成游离态可以通过save或saveOrUpdate()变成持久态 (2)当把session关闭时,session缓存中的persistent的po对象也变成detached 因关闭session而变成游离态的可以通过lock、save、update变成持久态 持久态实例可以通过调

shalocfolmosgmail的专栏 779

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Hibernate报错解决 a different object with the same identifier value was already associated with the sess

当用到Hibernate中saveOrUpdate()方法时,有时候会报错 a different object with the same identifier value was already associated with the session。经过研究发现了这个问题的根源供大家分享。

forsipphone的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

a different object with the same identifier value was already associated with the session的解决办法

把session.saveOrUpdate(role); 改为session.merge(role); 就搞定了官方的user faqI called saveOrUpdate() or update() and got a NonUniqueObjectException!The session maintains a unique mapping between persistent iden

1489

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

a different object with the same identifier value was already associated with the session异常解决办法

最近在使用hibernate的update方法插入实体的时候出现标题所示错误,后来发现是因为session中存在两个相同的实体,但是使用update的时候不知道具体插入哪一个所以报这个异常。          个人的解决办法:使用merge方法,这个方法的作用是saveorupdate,就是当数据库有这个Id值的数据的时候就更新,没有就插入。这个为什么能解决以上问题呢,因为它还有一个重要的特性,

u014492098的专栏 531

a different object with the same identifier value was already associated with the session: 的解决方法

a different object with the same identifier value was already associated with the session: 的解决方法 这个问题在我根据id去查我原本密码与新密码对比之后,再saveOrUpdate的时候就报错,错误就是session已经缓存了唯一id这个对象,因此就会出现这样的错误。

程序员小嗨 1万+

关于a different object with the same identifier value was already associated with the session解决方案

问题描述:这个著名的托管态update更新异常 org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated withthe session 早先的发生场景: 几乎所有搞过OrMapping持久化程序的开发者都多多少少碰到过这个异

Jason763的博客 4559

A different object with the same identifier value was already associated with the session

异常信息: A different object with the same identifier value was already associated with the session这个错误的意思就是在Hibernate的session中存在了两个对象去标记同一个实体代码分析:实体创建的代码:由于这些实体都是新创建的,准备新建一批数据记录写入表中,但是由于新建的实体,是游离状态,新建 ne...

奋斗中的小小酥 837

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

解决a different object with the same identifier value was already associated with the session错误 首先我的问题是没有给主键赋值,如下面代码,dc是我new出来的对象,一开始我并没有加这一行代码dc.setDataCenterID(dcList.get(0).getDataCent

每天问问自己,你今天努力了吗? 6459

论a different object with the same identifier value

问题:这个著名的托管态update更新异常 org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated withthe session早先的发生场景: 几乎所有搞过OrMapping持久化程序的开发者都多多少少碰到过这个异常. 这

Alex的博客 926

解决hibernate: a different object with the same identifier value was already assoc

今天做项目想更新update一个对象的时候碰到了这个问题,一直查找是什么原因,在网上看到一些错误的原因是 因为hibernate中同一个session里面有了两个相同标识但是是不同实体 一直报下面的错误: a different object with the same identifier value was already associated with the session。。 查...

yang576017120的专栏 487

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

这个问题,我把对象赋值为NULL,也是很好用的.在我的系统中,更新好用了,可是插入不好用了.没改前,是插入好用,而更新不好用.本来是系统中的问题,可是,catch只是捕捉到,从但是,没有把log打印出来,找原因实在是难找.在高度数据库时,最好把异常捕捉中的信息打印出来.org.springframework.orm.hibernate.HibernateSystemException: a dif

loaferwang的专栏 905

[已解决] Hibernate中NonUniqueObjectException: A different object with the same identifier 错误

在Hibernate写一个循环插入数据的test: import Entity.User; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class Test { public static void mai...

qq_33982232的博客 2552
上一篇: spring security入门
下一篇: 重温Hibernate级联(转)
w3053_5fdf588
博客等级 码龄18年 0粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值