merge的作用是:新new一个对象,如果该对象设置了ID,则这个对象就当作游离态处理:

                                      当ID在数据库中不能找到时,用update的话肯定会报异常,然而用merge的话,就会insert。

                                      当ID在数据库中能找到的时候,update与merge的执行效果都是更新数据,发出update语句;

                              如果没有设置ID的话,则这个对象就当作瞬态处理:

                               用update的话,由于没有ID,所以会报异常,merge此时则会保存数据,根据ID生产策略生成一条数据;

Session session1 = HibernateUtils.getSession();
Transaction transaction1 = session1.beginTransaction();
Students str1 = new Students();
str1.setStu_id(4);
str1.setName("222");
session1.merge(str1);
str1.setName("333");
transaction1.commit();
session1.clear();
session1.close();

下面是当对象在第一个session关闭后,处于游离状态,

第二个session开启,又get或load一样的ID的数据出来时,在第二个session中update那个游离态对象,

          update肯定会出错,原因是程序会报持久层中已经有该对象,

因为第二个session重新从数据库中获取了一个对象成持久态,你的update会让那个游离态对象也变成持久态,

两个持久态会冲突撒,然而用merge的话,它会把第一个的对象数据赋值给已经处于持久化的那个对象中,自己本身不得变为持久态;

Session session1 = HibernateUtils.getSession();

Transaction transaction1 = session1.beginTransaction();
Students str1 = (Students)session1.get(Students.class, 2);

transaction1.commit();

session1.clear();

session1.close();
Session session2 = HibernateUtils.getSession();

Transaction transaction2 = session2.beginTransaction();

Students str2 = (Students)session2.get(Students.class, 2);

session2.merge(str1);

transaction2.commit();

session2.clear();

session2.close();

Session session2 = HibernateUtils.getSession();

Transaction transaction2 = session2.beginTransaction();

Students str2 = (Students)session2.get(Students.class, 2);

str1.setName("wer");

session2.merge(str1);

System.out.println(str2.getName());

//这里改变了,说明持久态的数据也会改变

str2.setName("ee");

System.out.println(str1.getName());

//这里不会改变,说明第一个游离态的数据没有被持久化撒;

transaction2.commit();

session2.clear();

session2.close();

Hibernate中的merge使用详情解说的更多相关文章

  1. hibernate中的merge()方法

    Hibernate提供有save().persist().savaOrUpdate()和merge()等方法来提供插入数据的功能.前三者理解起来较后者容易一些,而merge()方法从api中的介绍就可 ...

  2. Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别

    首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...

  3. hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别

    hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别 转自http://www.blogjava.net/bnlovebn/archi ...

  4. 分享知识-快乐自己:Hibernate 中 get() 和 load()、sava、update、savaOrUpdate、merge,不同之处及执行原理?

    1):Hibernate 中 get()  和 load() 有什么不同之处? 1)Hibernate的 get方法,会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在缓存中查 ...

  5. 【hibernate】Hibernate中save, saveOrUpdate, persist, merge, update 区别

    Hibernate Save hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思.我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原 ...

  6. hibernate 中文文档

    转载:http://blog.csdn.net/kevon_sun/article/details/42850387 Hibernate Annotations 参考文档 3.2.0 CR1 目录 前 ...

  7. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  8. 关于hibernate中对象的三种状态分析

    一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load ...

  9. Hibernate中遇见的问题

    1.在用Hibernate写增删改查时,有两种方式:a.HQL语句,b.原生态sql语句 如果我要执行的语句是:select * from Question HQL是这么写的: Session ses ...

随机推荐

  1. NBOJv2——Problem 1002: 蛤玮的财宝(多线程DP)

    Problem 1002: 蛤玮的财宝 Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format:  %ll ...

  2. 【DFS序+树状数组】BNUOJ 52733 Random Numbers

    http://acm.bnu.edu.cn/v3/problem_show.php?pid=52733 [题意] 给定一棵树,这棵树每个点都有一个点权,标号从0开始,0是根结点 修改操作: SEED ...

  3. mybatis配置报错(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)

    如下报错:解决方案:要按照提示的顺序添加属性,(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrappe ...

  4. BS4(BeautifulSoup4)的使用--find_all()篇

    可以直接参考 BS4文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#find-all 注意的是: 1.有些 ...

  5. N皇后-位运算优化

    N皇后问题 时间限制: 5 Sec  内存限制: 128 MB 题目描述 魔法世界历史上曾经出现过一个伟大的罗马共和时期,出于权力平衡的目的,当时的政治理论家波利比奥斯指出:“事涉每个人的权利,绝不应 ...

  6. 送外卖(codevs 2800)

    题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一 ...

  7. 魔法森林(bzoj 3669)

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  8. Spring Task Schedule 及多线程

    http://spring.io/blog/2010/01/05/task-scheduling-simplifications-in-spring-3-0/‘ http://ekramalikazi ...

  9. hdu 1827 有向图缩点看度数

    题意:给一个有向图,选最少的点(同时最小价值),从这些点出发可以遍历所有. 思路:先有向图缩点,成有向树,找入度为0的点即可. 下面给出有向图缩点方法: 用一个数组SCC记录即可,重新编号,1.... ...

  10. [Bzoj1112][POI2008]砖块Klo(splay)

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2353  Solved: 831[Submit][Statu ...