一直很纳闷这个merge和persist方法,平时也很少用。今天研究下总结下
一、merge 翻译:合并;融合
其实merge方法很简单,看代码。
@Entity
public class Father {
@Id @GeneratedValue
private int id;
private String name;
唯一一个father实体类,执行session.merge(father)方法时,首先会查看father的id是否为空,
1.要是为空的话那就直接执行insert语句将father持久化,结束。
2.要是不为空,那么先执行select的语句查询father表中id为这个father.id的记录是否存在
A:存在,那好执行update语句,结束。
B:不存在,那么执行inset语句,结束。
很简单吧。
但是有一点要注意,看代码;
@Test
public void testChildSave() {
Father f = new Father();
f.setId(7);
f.setName("父亲1");
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.merge(f);
session.getTransaction().commit();
System.out.println(f.getId());
}
先说明在执行这段代码之前,father表没有任何记录。 按照上面的流程,先执行select语句,然后执行insert语句
这是控制台给出的hibernate的sql语句
Hibernate:
select
father0_.id as id1_0_,
father0_.name as name1_0_
from
Father father0_
where
father0_.id=?
Hibernate:
insert
into
Father
(name)
values
(?)
7
注意看最后的一个7,这是我们之前set的id,但是数据库的记录下对应的id是1;也就是说father对象经过merge方法后没有任何的变化,一直是一个transient状态。所以要注意,一个对象经过merge后它和数据库不一定一致。
现在我们来看看saveorupdate方法,这个方法也很简单,它会根据对象的id是否为空来决定进行inset或者update,
为空就inset,不为空就update,任何情况下都不会执行select语句,所以在update一个数据库不存在的id时会有Exception。
二、未完待续- - !
分享到:
相关推荐
Hibernate merge、update与saveOrUpdate方法的区别
NULL 博文链接:https://dreamzhong.iteye.com/blog/1218885
Hibernate中的merge使用详情解说
hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思。我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原因。 假如两个实体之间有关系(例如employee表和...
merge的作用是:新new一个对象,如果该对象设置了ID,则这个对象就当作游离态处理: 当ID在数据库中不能找到时,用update的话肯定会报异常,然而用merge的话,就会insert。 当ID在数据库中能找到的时候,update与...
里面给大家内嵌了Araxis Merge v6.5和Araxis Merge 2017两个版本,并配备了使用说明。 Araxis Merge v6.5:免安装版本,解压直接运行merge.exe即可正常使用(目前好像不支持Win10系统了,但是我同事的win10可以用,...
我身边的朋友经常会分不清save、saveOrUpdate、update的区别,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且关于实体对象的生命周期也有很多概念不清,分不清transient、persistent、...
Hibernate中session的merge以及update方法
8.4.1 Session的save()和persist()方法 191 8.4.2 Session的load()和get()方法 194 8.4.3 Session的update()方法 195 8.4.4 Session的saveOrUpdate()方法 197 8.4.5 Session的merge()方法 198 8.4.6 Session的...
8.4.1 Session的save()和persist()方法 8.4.2 Session的load()和get()方法 8.4.3 Session的update()方法 8.4.4 Session的saveOrUpdate()方法 8.4.5 Session的merge()方法 8.4.6 Session的delete()方法 ...
merge 比较工具 merge 比较工具merge 比较工具
免费Merge比较工具 win Merge
Araxis Merge 软件入门使用教程 Araxis Merge 软件入门使用教程 Araxis Merge 软件入门使用教程 Araxis Merge 软件入门使用教程 pdf
根据注释可以知道 merge 有两个职责: 1.如果对象为 unsaved,对对象的拷贝执行 save 方法,返回拷贝的对象。 2.如果对象为 detached,将对象的状态拷贝到和对象的标识一样的持久化对象中,如果持久化对象不存在,就...
做项目的时候通常版本与版本比较,因为下一个版本跟前一个版本差一点,可一般我们做多后查不出来,用WinMerge能很简单的查出来增加了哪里........
Mybatis批量foreach merge into的用法,这是介绍Mybatis批量foreach merge into的用法的文档
最新git项目开发中一键发起merge request工具,自动识别本地环境,支持windows、Linux、Mac,包含使用教程和资料。 非常简单的使用,下载脚本后,根据教程进行简单的配置,根据自己的操作系统类型,把注释部分选用...
WinMerge文件比较工具,WinMerge文件比较工具
WinMerge 3 ========== WinMerge 3 is a port of WinMerge (http://winmerge.org) to use cross-platform with Qt (http://qt.nokia.com/) framework. This project is still in very early stages. WinMerge 3 is...
android中include和merge标记的区别和使用