`
wzg1101
  • 浏览: 11573 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

hibernate的save,persis,update,saveOrUpdte,merge,flush,lock等区别

 
阅读更多
一,比较merge与update的区别

首先, merge作用大致相当于saveorupdate这个方法, 即有唯一性标识, 则运行save, 没有则运行update

    下面来比较2者的区别, update(object), 方法运行后, object是持久化状态, 而Object obj = merge(object), 方法运行后, object是脱管状态, obj是持久化状态

     最后比较2者的性能, 使用for循环测试10000次, merge: 150ms, update: 50ms, 显然update性能占优势.

     所以, merge的用法应该是在需要返回被保存的对象时使用.

对于hibernate,它的对象有三种状态,transient、persistent、detached
下边是常见的翻译办法:
transient:瞬态或者自由态
persistent:持久化状态
detached:脱管状态或者游离态

脱管状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。
持久化实例可以通过调用 delete()变成脱管状态。通过get()或load()方法得到的实例都是持久化状态的。
脱管状态的实例可以通过调用 update()、saveOrUpdate()、lock()或者replicate()进行持久化。

save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,
而update()或merge()会引发SQLUPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,
它也会引起SQLUPDATE。saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE

二、save 和update区别
把这一对放在第一位的原因是因为这一对是最常用的。
save的作用是把一个新的对象保存
update是把一个脱管状态的对象保存

三,update 和saveOrUpdate区别
这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和update
引用hibernate reference中的一段话来解释他们的使用场合和区别
通常下面的场景会使用update()或saveOrUpdate():
程序在第一个session中加载对象
该对象被传递到表现层
对象发生了一些改动
该对象被返回到业务逻辑层
程序调用第二个session的update()方法持久这些改动

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

四,saveOrUpdateCopy,merge和update区别
首先说明merge是用来代替saveOrUpdateCopy的,这个详细见这里
http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html
然后比较update和merge
update的作用上边说了,这里说一下merge的
如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例
如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例,最后返回该持久实例
用户给出的这个对象没有被关联到session上,它依旧是脱管的
重点是最后一句:
当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态
但当我们使用merge的时候,执行完成,我们提供的对象A还是脱管状态,hibernate或者new了一个B,或者检索到
一个持久对象B,并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态

五,flush和update区别
这两个的区别好理解
update操作的是在脱管状态的对象
而flush是操作的在持久状态的对象。
默认情况下,一个持久状态的对象是不需要update的,只要你更改了对象的值,等待hibernate flush就自动
保存到数据库了。hibernate flush发生再几种情况下:
1,调用某些查询的时候
2,transaction commit的时候
3,手动调用flush的时候

六,lock和update区别
update是把一个已经更改过的脱管状态的对象变成持久状态
lock是把一个没有更改过的脱管状态的对象变成持久状态
对应更改一个记录的内容,两个的操作不同:
update的操作步骤是:
(1)更改脱管的对象->调用update
lock的操作步骤是:
(2)调用lock把对象从脱管状态变成持久状态-->更改持久状态的对象的内容-->等待flush或者手动flush
分享到:
评论

相关推荐

    PyPI 官网下载 | persis-0.0.5-py3-none-any.whl

    标题中的"PyPI 官网下载 | persis-0.0.5-py3-none-any.whl"指的是一款名为`persis`的Python库,版本号为0.0.5,该库已打包成`.whl`格式,并且可以在Python的官方软件包索引(PyPI)上找到。`.whl`是Python的一种二...

    PyPI 官网下载 | persis-0.0.4-py3-none-any.whl

    标题 "PyPI 官网下载 | persis-0.0.4-py3-none-any.whl" 提供了关于一个Python软件包的信息,这个包在Python的官方软件包索引(PyPI)上可以找到,并且是名为"persis"的版本0.0.4。描述进一步确认了这个资源是从PyPI...

    Activiti连接达梦数据库.pdf

    在使用Activiti时,需要下载相关的依赖包,包括Activiti的核心包、数据库驱动包等。可以使用Maven仓库来管理这些依赖包。 3.1 IDEA配置使用阿里云Maven仓库 在IDEA中配置使用阿里云Maven仓库,可以加速依赖包的...

    nacos-naming-2.0.4.RELEASE-API文档-中文版.zip

    赠送jar包:nacos-naming-2.0.4.RELEASE.jar; 赠送原API文档:nacos-naming-2.0.4.RELEASE-javadoc.jar; 赠送源代码:nacos-naming-2.0.4.RELEASE-sources.jar; 赠送Maven依赖信息文件:nacos-naming-2.0.4....

    aedes-cached-persistence:使用订阅的进程内缓存编写Aedes持久性的抽象类

    伊迪斯缓存的持久性 抽象类,用于使用订阅的进程内缓存来编写。 它实现了由定义的API。 测验 执照 安装 要安装aedes-cached-persistence,只需使用npm:...var CachedPersistence = require ( 'aedes-cached-persis

    OWASP Mutillidae 靶机实验指导书

    - 其他注入类型:包括层叠样式表注入、CBC字节翻转、命令注入、帧源注入、HTML注入、HTTP参数污染、JavaScript注入、JSON注入、参数添加、XML外部实体注入、XML实体扩展、XML注入、XPath注入等,均展示了各种注入...

    activiti7.0支持达梦数据库连接

    网上有大部分的教程修改activiti源码,在编译的时候activiti 用的jdk是11的,大家可以自己找。我把我已经修改好的放上来

    docker-n8n:基于Alpine Linux的n8n Docker映像

    关于基于Alpine Linux的 Docker映像。 如果您有兴趣,我的其他Docker映像! :light_bulb: 想要收到新版本的通知吗? 退房 :bell: 项目!...max/n8n 提供此图像的以下平台: $ docker run --rm mplatform/mquery ...

    vue-router-storage-Vue.js 2和vue-router 2的路由器存储和解决方案-Vue.js开发

    当前功能Persis vue-router-storage Vue历史记录路由持久性的解决方案。 中文文档警告:当前版本仅支持历史记录模式! 当前功能持久性用户浏览记录,并在您重新输入(不刷新)Vue应用程序时自动恢复原始路径。 当您...

    dva-redux-persist:redux-persist@5.* 的 dva 版

    dva-redux-persistredux-persist@5.* 的 dva 版软件架构适用于 dva umi 项目安装教程yarn add dva-redux-...umi示例(或dva-cli@1.0.0.bate4版)// src/dva.jsimport { storageEnhancer } from 'dva-redux-persis

    flatware:用于RSpec和Cucumber的并行测试运行程序,具有出色的输出

    餐具 Flatware使您的测试套件并行化,从而大大减少了测试时间。餐具将您需要的跑步者添加到您的Gemfile中: gem 'flatware-rspec' , require : false # onegem 'flatware-... 如果您已设置了example_status_persis

    csi-rclone:rclone的CSI驱动程序

    CSI rclone安装插件 该项目实现了容器存储接口(CSI)插件,该插件允许使用作为存储后端。 可以使用Secret或PersistentVolume volumeAttibutes配置Rclone挂载点和。 Kubernetes集群兼容性 ... 如果您将始终在Persis

    JavaEE源代码 persistence

    JavaEE源代码 persistenceJavaEE源代码 persistenceJavaEE源代码 persistenceJavaEE源代码 persistenceJavaEE源代码 persistenceJavaEE源代码 persistenceJavaEE源代码 persistenceJavaEE源代码 persistenceJavaEE源...

    通信电路实习

    ### 通信电路实习知识点 ...在整个实习过程中,不仅需要掌握基本的电路设计与焊接技术,还需要学会如何使用专业软件进行电路板的设计,以及如何进行电路的调试等工作,这些都是成为合格的通信工程师必不可少的技能。

    通信原理课程设计——AM满调幅系统设计

    利用MATLAB集成环境下的Simulink仿真平台,设计一个AM满调幅系统,分别在理想信道和非理想信道中运行,并把运行仿真结果输入显示器,根据显示结果分析所设计的系统性能。

Global site tag (gtag.js) - Google Analytics