zoukankan      html  css  js  c++  java
  • Hibernate入门

    脏检查及刷新缓存机制:

    脏检查:当事物提交时,Hibernate会对session中持久状态的对象进行检测, 判断对象的数据是否发生改变

    为什么要进行脏检查?

    如果对象发生了改变,就需要将改变更新到数据库中,以确保内存中的对象与数据库中的数据保持一致。

    如何进行脏检查?

    当一个Dept对象被加入到Session缓存(有人又称为 一级缓存  后者是内部缓存)中时,Session会为Dept对象的值类型的属性复制一份快照。当Session刷新缓存时,会先进行脏检查,即比较Dept对象的当前属性与它的快照,来判断Dept对象的属性是否发生了变化。如果发生了变化,Session会根据脏对象的最新属性值来执行相关的SQL语句,将变化更新到数据库中。

    延迟加载:

    1.Get()load()的区别

       Load()没有使用对象的其他属性的时候,没有SQL  延迟加载

       Get() :没有使用对象的其他属性的时候,也生成了SQL  立即加载

    Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。

    /** *//**
      * get()方法的执行顺序如下:
      * a):首先通过idsession缓存中查找对象,如果存在此id的对象,直接将其返回
      * b):在二级缓存中查找,找到后将 其返回。
      * c):如果在session缓存和二级缓存中都找不到此对象,则从数据库中加载有此ID的对象
      * 因此get()方法并不总是导致SQL语句,只有缓存中无此数据时,才向数据库发送SQL 
      */

     /** *//**
      * get()的区别:
      * 1:在立即加载对象(当hibernate在从数据库中取得数据组装好一个对象后
      * 会立即再从数据库取得数据此对象所关联的对象)时,如果对象存在,
      * load()get()方法没有区别,都可以取得已初始化的对象;但如果当对
      * 象不存在且是立即加载时,使用get()方法则返回null,而使用load()
      * 抛出一个异常。因此使用load()方法时,要确认查询的主键ID一定是存在
      * 的,从这一点讲它没有get方便!

    * 2:在延迟加载对象(Hibernate从数据库中取得数据组装好一个对象后,
      * 不会立即再从数据库取得数据组装此对象所关联的对象,而是等到需要时,
      * 都会从数据库取得数据组装此对象关联的对象)时,get()方法仍然使用
      * 立即加载的方式发送SQL语句,并得到已初始化的对象,而load()方法则
      * 根本不发送SQL语句,它返回一个代理对象,直到这个对象被访问时才被
      * 初始化。
      */

      是什么导致了延迟加载

      解析:是因为内存中构建了代理对象。

    上面的get 将会输出SQL语句,而下面的则不会输出SQL

     

    同样为load则分割线上下均不输出SQL

     

    上面为get  下面为load 则分割线上面输出SQL  下面没有

  • 相关阅读:
    网盘搜索网站汇总
    AutoIt3病毒杀毒攻略(详)
    数据库的逻辑结构设计
    Oracle数据类型
    选择ORACLE数据库字符集
    ETL讲解(很详细!!!)
    Oracle左连接,右连接,全外连接和+号的用法
    Oracle用户创建及权限设置
    内连接、外连接、自然连接
    关系数据库关系代数
  • 原文地址:https://www.cnblogs.com/Smile-123/p/5817908.html
Copyright © 2011-2022 走看看