博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate中update()和merge()的区别
阅读量:6845 次
发布时间:2019-06-26

本文共 707 字,大约阅读时间需要 2 分钟。

hot3.png

初学hibernate时,对于session中的update()和merge()两个方法,很容易搞混,觉得两种都能用,有时候,又觉得不知道该用哪一种。

实际上,这两个方法,是有很大区别的

首先,对于一个处于detatch状态的实体对象来说,要将其中的修改,合并到数据库中,有两种方法,一种方式,是调用update(),另一种方式是调用merge()

当调用update()时,首先要确保目标session中,不包含同样id的实体对象的引用,如果有的话,会抛出异常,完成update()方法后,这个实体对象从detatch状态,转换为persistent状态,在session提交前,后续对其的修改,都会被合并到数据库中。

当调用merge()对象时,无需考虑session中是否已经包含同样id的实体对象,如果session中没有同样id的实体对象,hibernate会通过select语句,从数据库中查询出对应对象,如果数据库中没有对应对象,就新建一个。同时,完成merge()操作后,会返回数据库中对应的persistent状态对象,而原有的,作为参数传入的实体对象,仍然是detatch状态,后续代码对其的修改,无法合并到数据库中。如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象覆盖session已有的持久实例(把处于detatch的po对象A的属性copy到session当中处于持久态的po的属性中,执行完成后原来是持久状态还是持久态,而我们提供的A还是原来状态)。

转载于:https://my.oschina.net/u/2367628/blog/748366

你可能感兴趣的文章
C# 程序中如何获取当前目录
查看>>
lucene初识
查看>>
我的友情链接
查看>>
网卡工作模式
查看>>
deepin安装Curl的方法
查看>>
SAP系统日常管理 常见 t-code (一)
查看>>
C++ VS2010 error:LNK2005 已经在*.obj中定义
查看>>
Linux 多线程编程
查看>>
在rhel7中搭建openstack kilo
查看>>
我的友情链接
查看>>
there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
查看>>
LINUX下多路径(multi-path)介绍及使用
查看>>
自动安装varnish shell脚本
查看>>
java内存管理以及GC
查看>>
php REST程序设计的uml图
查看>>
基于通信层的HTTP和SOAP消息跟踪
查看>>
cronolog切割tomcat日志以及日志导出方法
查看>>
shell计算掩码位数
查看>>
selenium webdriver 实例Opera w/python
查看>>
java体系结构
查看>>