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返回持久化对象的副本,该副本处于持久化态。

  • 相关阅读:
    Tensorflow实战(二):Discuz验证码识别
    文竹越长越乱?教你7种修剪方法可保持文竹株形优美,矮壮浓密
    拼应需求分析
    软工实践结对第二次作业
    软工团队第一次作业--团队展示
    学习命令行传参
    软工实践第三次作业-原型设计
    软工实践第二次作业2.0
    软工实践第二次作业
    学习c++ofstream和ifstream
  • 原文地址:https://www.cnblogs.com/mlq2017/p/9820871.html
Copyright © 2011-2022 走看看