分享知识-快乐自己:Hibernate 中 get() 和 load()、sava、update、savaOrUpdate、merge,不同之处及执行原理?
1):Hibernate 中 get() 和 load() 有什么不同之处?
1)Hibernate的 get方法,会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在缓存中查找,还没有就查询数据库,数据库中没有就返回null。
2)Hibernate的 load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true):
① 若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。
等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。
----
② 若 为false,就跟Hibernate的get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException,所说的load方法抛异常是指在使用该对象的数据时,
数据库中不存在该数据时抛异常,而不是在创建这个对象时。
2):sava()?
Session的save()方法用来将一个临时对象转变为持久化对象,也就是将一个新的实体保存到数据库中。通过save()将持久化对象保存到数据库需要经过以下步骤:
1,系统根据指定的ID生成策略,为临时对象生成一个唯一的OID;
2,将临时对象加载到缓存中,使之变成持久化对象;
3,提交事务时,清理缓存,利用持久化对象包含的信息生成insert语句,将持久化对象保存到数据库。
提示:保存的时候跟主键生成策略有直接关系,常用属性如下
<!--手动主键生成策略--> <generator class="assigned"/> <!--indentity:针对mysql数据库--> <!--sequence:针对于oracle数据库--> <!--increment:查询数据库最大主键值+1-->
3):update()?
1):首先你要知道,hibernate的update操作的运行机理:
2):hibernate的update是怎么样自动的进行update操作的呢?
3):首先hibernate先会执行一个select操作,到数据库中查找
4):当前要update操作的对象的主键是否存在,类似于:
5):select id from table where id=XXX
6):如果查找到了改id,就说明该对象是一个持久化对象,
7):如果该对像的某些属性变化了,hibernate就会自动的执行update操作,
8):同步数据库中的该对象。
9):如果数据库找不到要更新的对象,则会报异常找不到需要更新的对象
提示点:update 默认会更新所有字段信息。要想实现动态更新字段 需要修改映射文件添加以下配置:dynamic-update="true"
4):savaOrUpdate()?
简单来说就是 保存或者更新,那么是如何实现的那?
保存:的依据就是,根据当前 new的这个对象判断他的 OID 是否有效(也可以理解为主键在数据库中是否存在)如果无效则执行保存操作。
更新:同理保存的理念,如果OID 有效则执行更新操作。
提示:这里的更新不会优先执行查询的SQL语句,而是直接更新所有字段。
5):merge()?
1):如果merge的对象在数据库中不存在,merge将会进行save操作,作用等同于updateOrSave();而update因为找不到对象而报错。)
2):如果merge的对象能在数据库中操作,merge操作和update操作效果一样。
3):新new一个对象,如果该对象设置了ID,则这个对象就当作游离态处理。
4):merge可以持久化游离态的对象A,持久化后的对象A仍然处于游离态,持久化的对象A不和session关联。
5):merge返回持久化对象的副本,该副本处于持久化态。
分享知识-快乐自己:Hibernate 中 get() 和 load()、sava、update、savaOrUpdate、merge,不同之处及执行原理?的更多相关文章
- Hibernate中Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法有什么区别?
Hibernate的对象有三种状态:瞬态.持久态和游离态.游离状态的实例可以通过调用save().persist()或者saveOrUpdate()方法进行持久化:脱管状态的实例可以通过调用 upda ...
- Hibernate中get()和load()方法区别
get和load方式是根据id取得一个记录下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来. 1.从返回结果上对比:load方式检索不到的话会抛出org.hibernat ...
- Hibernate中get()和load()的区别
Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别. 1. get() 使用get()来根据ID进行单条查询: User user=se ...
- 【hibernate】Hibernate中get()和load()的区别
Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别. 1. get() 使用get()来根据ID进行单条查询: 1 User user= ...
- Hibernate中get()与load()的区别,以及关于ThreadLocal的使用方法
一.get方法和load方法的简易理解 (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时 ...
- Hibernate中Session.get()/load()之区别
原文链接http://sunxin1001.iteye.com/blog/292090 Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象.其区 ...
- hibernate中get和load区别
在日常开发中,获取数据时必不可少的,这样就要用到get和load方法来实现了.下面简单说一下get和load的区别. 1.返回值不同 使用get方法检索数据时,没有该数据返回值为null. 而使用lo ...
- hibernate中save()、update()、saveOrUpdate()的区别
save()方法很显然是执行保存操作的,如果是对一个新的刚new出来的对象进行保存,自然要使用这个方法了,数据库中没有这个对象. update()如果是对一个已经存在的托管对象进行更新那么肯定是要使用 ...
- Hibernate 中 get()和load()的区别
一.1.程序检索数据库中不存在的OID: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回nu ...
随机推荐
- codeforces 204(Div.1 A) Little Elephant and Interval(贪心)
题意: 有一种个位数与最高位数字相等的数字,求在l,r的范围内,这样的数字的个数. 思路: 找下规律就知道当当n>10的时候除去个位以后的答案等于n/10,然后考虑第一个数字是否小于最后一个.小 ...
- hdfs笔记
Distributed File System 数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文 ...
- oracle select into相关
自定义参数输出: declare v_test integer :=0 ;beginselect count(*) into v_test from tf_estate_card t ;dbms_o ...
- JAVA实现KNN分类
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/51064307 http://www.llwjy.com/blogdetail/f ...
- JOB Hunting 总结-----2013-11-5
从9月份开始的找工作大战,告一段落:其实早在10月中旬就已搞定,现在回想起这过去的几个月,很充实,很疲惫,很挫败又很有成就感! 开始找工作,对未来有过很多憧憬,也很迷茫,不知道自己的未来会在 ...
- Linux系统运维之路
九月份开始,半年内搞定运维,博客会慢慢的更新,vim编辑器,Nginx配置文件优化 运维基础 运维基础-Linux发展史.安装.基本操作 运维基础-用户和组管理 运维基础-文件权限管理 运维基础-进程 ...
- android之Context对各种服务的管理
经常,当我们须要用到服务的时候能够通果Context来获取:Context.getSystemService(name):比方:当我们想知道当前电话状态(来电/去电/sim卡状态等)时候,我们能够通过 ...
- jdbc 链接池的优化
package cn.itcast.jdbc.datasourse; import java.sql.Connection;import java.sql.DriverManager;import j ...
- 2015最流行的Android组件、工具、框架大全(转)
转自:2015最流行的Android组件.工具.框架大全 Android 是目前最流行的移动操作系统之一. 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生 ...
- MySQL中使用INNER JOIN来实现Intersect并集操作
MySQL中使用INNER JOIN来实现Intersect并集操作 一.业务背景 我们有张表设计例如以下: CREATE TABLE `user_defined_value` ( `RESOURCE ...