zoukankan      html  css  js  c++  java
  • 转:Hibernate一级缓存

    Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveOrUpdate()等方法,及调用查询接口list,filter,iterate时,如Session缓存中不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭时,该Session所管理的一级缓存也会立即被清除。

    Java代码
    1. 注意:Hibernate的一级缓存是Session所内置的,不能被卸载,也不能进行任何配置  
    注意:Hibernate的一级缓存是Session所内置的,不能被卸载,也不能进行任何配置


    一级缓存采用的是key-value的Map方式来实现的,在缓存实体对象时,对象的主关键字ID是Map的key,实体对象就是对应的value。所以说,一级缓存是以实体对象为单位进行存储的,在访问时使用的是关键字ID。虽然,Hibernate对一级缓存使用的是自动维护的功能,没有提供任何配置功能,但是可以通过Session中提供的方法来对一级缓存的管理进行手工干预。

    get与load的区别

    使用get方法获得持久化对象时,首先查找Session缓存(一级缓存)是否有该对象,如果有,则获得该对象;如果没有,就会访问数据库,如果数据库中找不到数据,则返回null。
    load方法也是获得数据,但不同的地方是load方法已经假定数据库中一定存在该数据,如果在数据库中找不到该数据,则会抛出一个org.hibernate.ObjectNotFoundException异常。
    load方法获得对象的过程是:load方法首先在Session缓存中查找对象,如果找不到则查找SessionFactory缓存(二级缓存),如果再找不到则访问数据库。值得注意的是,load方法是假定数据库中一定有该数据,所以使用代理来延迟加载对象,只有在程序中使用了该对象的属性(非主键属性)时,Hibernate才会进入load方法的获得对象过程。所以说,如果数据库中不存在该记录,异常是在程序访问该对象属性时抛出的,而不是在创建这个对象时就抛出。

  • 相关阅读:
    Qt 主窗口与子窗口之间传值
    Qt 如何使窗体初始最大化
    C++ strcmp与strncmp的比较
    Qt 状态栏(statusbar)的使用
    C++中的补零
    Qt QString转char[]数组
    PAT基础6-9
    PAT基础6-8
    PAT基础6-6
    PAT基础6-7
  • 原文地址:https://www.cnblogs.com/phoebus0501/p/1894492.html
Copyright © 2011-2022 走看看