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();

最新文章

  1. 多个supplemental logging的说明与删除
  2. 【leetcode】Intersection of Two Linked Lists
  3. jQuery+HTML5弹出创意搜索框层
  4. 1.go的Hello
  5. sklearn学习笔记1
  6. 安装 CentOS 后的系统配置及软件安装备忘
  7. Centos更新yum packet源
  8. Linux下向SVN服务器添加新文件步骤
  9. ASP.NET将word文档转换成pdf的代码
  10. 【剑指offer】面试题24:二叉搜索树的后序遍历序列
  11. hadoop执行hdfs文件到hbase表插入操作(xjl456852原创)
  12. js特殊字符转义
  13. git push报错
  14. 浅谈PipelineDB系列一: Stream数据是如何写到Continuous View中的
  15. [翻译]HTML5 - 会话历史和导航
  16. js match函数注意
  17. azkaban使用--指定executor
  18. 20165221学习基础和C语言基础调查
  19. BZOJ1482 : [Balkan2017]Cats
  20. hdu 3555 Bomb ( 数位DP)

热门文章

  1. 【Luogu】P1393动态逆序对(树套树)
  2. NAND FLASH 物理结构分析
  3. N皇后-位运算优化
  4. 巴蜀2904 MMT数
  5. dos中定义变量与获取常见的引用变量以及四则运算、备份文件(set用法)
  6. golang文件下载断点续传(下载客户端)
  7. AC日记——友好城市 洛谷 P2782
  8. Win10激活Office2013的技巧
  9. 【面试 JVM】【第六篇】JVM调优
  10. 通过Python实现自动填写调查问卷