一、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状态为脱管。

最新文章

  1. Django分析之导出为PDF文件
  2. C# 整数转二进制字符串
  3. HTML5本地存储——IndexedDB(二:索引)
  4. Java设计模式——装饰者模式
  5. redhat Nginx 安装
  6. IE下实现打印功能
  7. 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
  8. 魔兽世界私服Trinity,从源码开始
  9. 在Tomcat中部署Java Web应用程序
  10. hdu2044java递推
  11. 通过Jetty搭建一个简单的Servlet运行环境
  12. PHP 类属性 类静态变量的访问
  13. Backbox Linux简介与配置内网IP
  14. Java-TreeSet的用法-入门
  15. echarts-饼状图默认选中高亮
  16. Debian如何永久添加静态路由
  17. 201771010134杨其菊《面向对象程序设计(java)》第十六周学习总结
  18. SQL: 某个时间段范围内,产品有价格,且求平均数
  19. LevelDB源码分析-编码
  20. bzoj5280/luogu4376 MilkingOrder (二分答案+拓扑序)

热门文章

  1. 内存检查工具Valgrind
  2. mysql lock
  3. django连接mongodb mongoengine
  4. MySQL临时表的简单用法(复制)
  5. JVM内存分配原理
  6. 日志处理(三) logback 手动加载(转)
  7. centos7防火墙的简单配置介绍
  8. 老话题之C#写邮件发送
  9. asp.net发送短信
  10. spark + yarn调试问题java.nio.channels.ClosedChannelException