论Sava(),SaveOrUpdate(),Merge()区别
一、Save():
用于将一个临时对象转变为持久化对象,也就是将一个新的业务实体保存到数据库中;相当于jdbc的insert。
《假如两个实体之间有关系(例如employee表和address表有一对一关系),如果在没有事务的情况下调用这个方法保存employee这个实体,除非调用flush()这个方法,否则仅仅employee实体会被保存。》
二、SaveOrUpdate():
兼具了save()和update()方法的功能,该方法根据传入参数的状态执行不同的操作,当为临时状态时,调用save()方法;当为持久化状态时,则直接返回;当为游离状态时,调用update()方法。
SaveOrUpdate()方法会执行插入或者更新操作。如果该对象在数据库中已经存在则更新,不存在则插入。
SaveOrUpdate()方法可以在没有事务的情况下执行,但是如果没有手动调用flush()方法会面临关联对象不被保存的问题
Save()方法与saveOrUpdate()方法最大的不同点在于,saveOrUpdate()方法会将实体对象添加到持久化上下文中,该实体的后续改变被跟踪。
HibernateSaveOrUpdateExample.java
三、Hibernate的Merge()方法:
下面讲Hibernate的merge方法,按照Hibernate对象生命周期的三个状态来书写:
1.如果POJO对象处于游离态,我所说的游离态是指该对象的id值为空。hibernate判断一个对象在数据库中是否存在不是看对象的其他信息,而是判断该id在数据库中是不是存在。如果id为空,那自然是不存在,所以当我们调用merge方法的时候,就会直接执行插入操作。这一点有点像saveorupdate()方法。
2.持久态更好理解。如果我们从数据库里get一条记录,那么这条记录就处于持久态,如果再调用merge,那么hibernate就会先判断该记录是否被修改,没有则什么也不干,修改了就update。这一点还是和saveorupdate()有点像。
3.脱管态
四、SaveOrUpdate与Merge的方法区别:
merge方法是把我们提供的对象转变为托管状态的对象;而saveOrUpdate则是把我们提供的对象变成一个持久化对象;
说的通俗一点就是:saveOrUpdate后的对象会纳入session的管理,对象的状态会跟数据库同步,再次查询该对象会直接从session中取,merge后的对象不会纳入session的管理,再次查询该对象还是会从数据库中取。
//以下为Update与Merge的区别:
首先在执行更新操作的时候,两者都必须要有id
update是直接执行update 语句,执行后状态为持久化状态。
而merge则不一样:
1. 如果session中有与之对应的对象,也就是主键相同,则会把要保存的obj的值copy给session中的对象,然后update被复制后的session中的对象
2. 如果session中没有,则会先从数据库中select,然后把obj给查出来的对象copy,则update查出来的对象。
3. 所以merge会先select 再update
4. 所以merge后原来的对象obj状态为脱管。
论Sava(),SaveOrUpdate(),Merge()区别的更多相关文章
- Hibernate update 和 merge 、saveOrUpdate的区别
this.getSession().update(obj); this.getSession().merge(obj); this.getSession().saveOrUpdate(obj); 1. ...
- Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用 引自http://www.blogjava.net/TiGERTiAN/archive/2008/10/25/236519.html
Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...
- memge和saveOrUpdate的区别
今天做hibernate开发的时候遇到这样一个错误: a different object with the same identifier value was already associated ...
- Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用
Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...
- get merge --no-ff和git merge区别、git fetch和git pull的区别
get merge --no-ff和git merge区别 git merge -–no-ff可以保存你之前的分支历史.能够更好的查看 merge历史,以及branch 状态. git merge则不 ...
- save(),saveOrUpdate(),merge()的区别
Save save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思.我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原因.假如两个实体之间有关系(例如empl ...
- Hibernate里save(),saveOrUpdate(),merge(),update()的区别
save()方法用于将一个临时对象转变为持久化对象,也就是将一个新的业务实体保存到数据库中:update()方法用于将一个游离对象重新转变为持久化对象,也就是更新一个已经存在的业务实体到数据库中:sa ...
- save与 merge与 saveOrUpdate的区别
save()方法很显然是执行保存操作的,如果是对一个新的刚new出来的对象进行保存,自然要使用这个方法了,数据库中没有这个对象. update()如果是对一个已经存在的托管对象进行更新那么肯定是要使用 ...
- hibernate的update、merge和saveOrUpdate的区别(转)
1.首先 saveOrUpdate返回void 也就是什么都不返回 而merge会返回一个对象 2.其次 saveOrUpdate的做法是:自动判断该对象是否曾经持久化过,如果曾持久化过则使用upda ...
随机推荐
- [CentOS] 常用工具软件包
gcc & g++ & gdb • 安装方法 yum install gcc -y yum install gcc-c++ -y yum install gdb -y ...
- js自动类型转换
<script> testeq0 = null == undefined; testeq1 = "0" == 0; //比较前字符串转换为数字 testeq2 = 0 ...
- 杭电1020Encoding
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1020 题目: Problem Description Given a string containing ...
- BestCoder #58 div1
2015-10-08 19:14:54 总结:赛后补的一场.题目蛮有意思的. A:DFS 思路:搜一下几个环然后判断一下即可. #include <cstdio> #include < ...
- SpringMVC整合ActiveMQ
spring activeMq 配置 <!-- ActiveMQ 连接工厂 --> <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服 ...
- Django学习笔记之ORM字段和字段参数
Object Relational Mapping(ORM) 一.ORM介绍 1. ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ...
- Nginx 部署HTTPS
Nginx 部署HTTPS 系统:Linux Centos 7.4 x64 软件:Nginx 1.12.2 注:需要阿里云申请本地域名与证书并添加下载到本地. 注:证书文件为 xxxx.pem 与 x ...
- The mind
Youtube励志红人Mateusz M,最近刚推出了网友期待已久最新励志短片<The mind>,短短一周播放量已近50万.来自波兰的他,年仅23岁,用自己擅长的蒙太奇,已创作十几个影响 ...
- hadoop cgroup+container配置
配置container-executor.cfg vim etc/hadoop/container-executor.cfg yarn.nodemanager.linux-container-exec ...
- Java-Minor GC、Major GC、Full GC
Minor GC: 回收年轻代(Young)空间,包括Eden区.Survivor区. JVM无法为一个新对象分配空间时,比如eden区满了,就会触发Minor GC. Major GC: 清理永久代 ...