zoukankan      html  css  js  c++  java
  • 分享知识-快乐自己: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返回持久化对象的副本,该副本处于持久化态。

  • 相关阅读:
    UVa 116 单向TSP(多段图最短路)
    POJ 1328 Radar Installation(贪心)
    POJ 1260 Pearls
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    UVa 1620 懒惰的苏珊(逆序数)
    POJ 1018 Communication System(DP)
    UVa 1347 旅行
    UVa 437 巴比伦塔
    UVa 1025 城市里的间谍
  • 原文地址:https://www.cnblogs.com/mlq2017/p/9820871.html
Copyright © 2011-2022 走看看