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,不同之处及执行原理?的更多相关文章

  1. Hibernate中Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法有什么区别?

    Hibernate的对象有三种状态:瞬态.持久态和游离态.游离状态的实例可以通过调用save().persist()或者saveOrUpdate()方法进行持久化:脱管状态的实例可以通过调用 upda ...

  2. Hibernate中get()和load()方法区别

    get和load方式是根据id取得一个记录下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来. 1.从返回结果上对比:load方式检索不到的话会抛出org.hibernat ...

  3. Hibernate中get()和load()的区别

    Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别. 1. get() 使用get()来根据ID进行单条查询: User user=se ...

  4. 【hibernate】Hibernate中get()和load()的区别

    Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别. 1. get() 使用get()来根据ID进行单条查询: 1 User user= ...

  5. Hibernate中get()与load()的区别,以及关于ThreadLocal的使用方法

    一.get方法和load方法的简易理解 (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时 ...

  6. Hibernate中Session.get()/load()之区别

    原文链接http://sunxin1001.iteye.com/blog/292090 Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象.其区 ...

  7. hibernate中get和load区别

    在日常开发中,获取数据时必不可少的,这样就要用到get和load方法来实现了.下面简单说一下get和load的区别. 1.返回值不同 使用get方法检索数据时,没有该数据返回值为null. 而使用lo ...

  8. hibernate中save()、update()、saveOrUpdate()的区别

    save()方法很显然是执行保存操作的,如果是对一个新的刚new出来的对象进行保存,自然要使用这个方法了,数据库中没有这个对象. update()如果是对一个已经存在的托管对象进行更新那么肯定是要使用 ...

  9. Hibernate 中 get()和load()的区别

    一.1.程序检索数据库中不存在的OID:     load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常     get方法检索不到的话会返回nu ...

随机推荐

  1. vue v-for与v-if组合使用

    当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中.当你想为仅有的_一些_项渲染节点时,这种优先级的机制会十分有用,如下: < ...

  2. UNP学习笔记(第三十章 客户/服务器程序设计范式)

    TCP测试用客户程序 #include "unp.h" #define MAXN 16384 /* max # bytes to request from server */ in ...

  3. pom.xml基础配置

    pom.xml基础配置: maven中,最让我迷惑的还是那一堆配置! 就拿这个属性配置来说: 我需要让整个项目统一字符集编码,就需要设定 <project.build.sourceEncodin ...

  4. HTTP头解读

    Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET.POST.PUT.DELETE.一个URL地址用于描述一个网络上的资源, 而HTTP中的GET.POST.PUT. DELETE ...

  5. 安装CoreOS到磁盘

    1 打开翻&&墙软件 2 打开迅雷,启用“使用IE代理”,下载以下两个文件:(翻&&墙后用IE下会中断) http://stable.release.core-os.n ...

  6. CSU - 1556 Jerry&#39;s trouble(高速幂取模)

    [题目链接]:click here [题目大意]:计算x1^m+x2^m+..xn^m(1<=x1<=n)( 1 <= n < 1 000 000, 1 <= m < ...

  7. URL Handle in Swift (一) -- URL 分解

    更新时间: 2018-6-6 在程序开发过程之中, 我们总是希望模块化处理某一类相似的事情. 在 ezbuy 开发中, 我接触到了对于 URL 处理的优秀的代码, 学习.改进.记录下来.希望对你有所帮 ...

  8. cmake学习之- cmake_parse_arguments

    最后更新: 2019-06-08 一.指令介绍 cmake_parse_arguments 为解析函数(function)或 宏(macros) 参数的命令: cmake_parse_argument ...

  9. php迭代器模式

    其实就是遍历数组 然后对数组中的元素进行操作 实现iterator接口即可.

  10. Linux相互排斥与同步应用(三):posix线程实现单个生产者和单个消费者模型

            [版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu.文章仅供学习交流,请勿用于商业用途]         在第一节说到了 ...