热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

H​i​b​e​r​n​a​t​e​​m​e​r​g​e​、​u​p​d​a​t​e​与​s​a​v​e​O​r​U​p​d​a​t​e​方​法​的​区​别

通常下面的场景会使用update()或saveOrUpdate():?程序在第一个session中加载对象?该对象被传递到表现层?对象发生了一些改动?该对象被返回到业务逻辑层
通常下面的场景会使用update()或saveOrUpdate(): 


?程序在第一个session中加载对象 
?该对象被传递到表现层 
?对象发生了一些改动 
?该对象被返回到业务逻辑层 
?程序调用第二个session的update()方法持久这些改动 


saveOrUpdate()做下面的事: 


?如果对象已经在本session中持久化了,不做任何事 
?如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常 
?如果对象没有持久化标识(identifier)属性,对其调用save() 
?如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save() 
?如果对象是附带版本信息的(通过) 并且版本属性的值表明其是一个新实例化的对象,save()它。 
?否则update() 这个对象 




merge()可非常不同: 


?如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例 
?如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例 
?最后返回该持久实例 
?用户给出的这个对象没有被关联到session上,它依旧是脱管的 




update和merge方法,例子 
1. 数据库记录已存在,更改person的name为一个新的name。 


merge方法打印出的日志如下: 
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
 Hibernate: update person set name=? where id=? 


update方法打印出的日志如下: 
Hibernate: update person set name=? where id=? 


2. 数据库记录已存在,更改person的name和数据库里对应id记录的name一样的值。 


merge方法打印出的日志如下: 
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
 此处相对于第一种情形少了update的动作 


update方法打印出的日志如下: 
Hibernate: update person set name=? where id=? 


3. 数据库记录不存在时,也就是你传的实体bean的ID在数据库没有对应的记录。 


merge方法打印出的日志如下: 
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
 Hibernate: insert into person (name) values (?) 
如果没有对应的记录,merge会把该记录当作新的记录来插入。

推荐阅读
  • mysql相关操作_MySQL之记录相关操作
    一介绍MySQL数据操作:DML在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括使用INSERT实现数据的插 ... [详细]
  • 自定义RecyclerView添加EmptyView
    你知道RecyclerView里没有Em ... [详细]
  • delphi控件大全
    本文章已收录于:delphi控件查询:http:www.torry.nethttp:www.jrsoftware.orgTb97最有名的工具条(ToolBar) ... [详细]
  • insert into select 主键自增_为什么 MySQL 的自增主键不单调也不连续
    为什么这么设计(Why’sTHEDesign)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问 ... [详细]
  • 一、使用ContentProvider(内容提供者)共享数据ContentProvider在android中的作用是对外共享数据,也就是说 ... [详细]
  • 接口自动化相关面试题
    你好,我是懂Java的测试最近辅导简历,有同学向我反馈,自学过接口自动化、没有落地接口自动化项目办?还有很多同学落地实践过自 ... [详细]
  • oracle text db2,从Oracle 到DB2(一)
    在实际的软件项目的开发过程中,特别是在企业的应用系统集成(EAI)项目中广大开发人员经常遇到不同关系型数据库之间的数据移植问题。笔者根据自己在工作中的不同数据库数据移 ... [详细]
  • 第一部分:TSqlTop有两种用法1,限制查询结果集返回的行数或总行数的百分比。当将TOP与ORDERBY子句结合使用时,结果集限制为前N个已排序行;否则,以未定义的顺序返回前N个 ... [详细]
  • 1,Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合。它没有用户界面,并且也不会产生任何可视输出。任何用户 ... [详细]
  • 如何实现Percona Mysql Galera多读写集群的部署
    本篇文章给大家主要讲的是关于如何实现PerconaMysqlGalera多读写集群的部署的内容,感兴趣的话就一起来看看这篇文章吧,相信看完如何实现PerconaMysq ... [详细]
  • spotify engineering culture part 1
    原文,因为原视频说的太快太长,又没有字幕,于是借助youtube,把原文听&打出来了。中文版日后有时间再翻译。oneofthebigsucceessfactorshereatSpo ... [详细]
  • 我正在使用数组列表通过构建一个交互式菜单供用户选择来存储来自用户输入的值。到目前为止,我的两个选择是为用户提供向列表输入数据和读取列表的全部内容。到目前为止,我创建的代码由两个类组成。 ... [详细]
  •  12.1微服务的原则 我们在第2章讨论过,微服务原则可以发挥什么样的作用。它们 ... [详细]
  • Matlab中利用mex编译Opencv实现画板绘图功能
    图形绘制是标记和可视化数据的重要方法.通过在Matlab中集成画板绘图功能,可为科学计算提供便利.1设置Matlab支持Opencv编译操作系统:麒麟14.04(基于Ubu ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
author-avatar
小贤少_129
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有