💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 简介 Hibernate的一级缓存就是指session缓存。 ![](https://box.kancloud.cn/a7a3523af300a32fc8cb5918fd9f45ff_1730x120.png) actionQueue它是一个行列队列,它主要记录crud操作的相关信息 persistenceContext它是持久化上下文,它其实是真正缓存。 在session中定义了一系列的集合来存储数据,它们构成session缓存。 只要session没有关闭,它就会一直存在。 当我们通过hibernate中的session提供的一些API例如 save get update等进行操作时,就会将持久化对象保存到session中,当下一次在去查询缓存中具有的对象(OID值来判断), 就不会去从数据库查询,而是直接从缓存中获取。 Hibernate的一级缓存存在的目的就是为了减少对数据库访问。 在hibernate中还有一个二级缓存,它是SessionFactory级别缓存。 # 一级缓存 ## 简介 ![](https://box.kancloud.cn/5ee49f33cfc8aaaaab370dc655efe261_849x550.png) 演示一级缓存的存在 ![](https://box.kancloud.cn/0c6edb8e113c527667cb8c9bc7d2e03c_678x217.png) 持久化对象具有自动更新数据库的能力 ![](https://box.kancloud.cn/4cbf053372d44dd1753a0278f4ef6d9e_684x239.png) **为什么持久化对象具有自动更新数据库的能力?** ![](https://box.kancloud.cn/fcb0217fbfdefbc5f434d6e845c949aa_829x143.png) ![](https://box.kancloud.cn/3feab998b41523c96be0d1d0f76c4f97_1113x507.png) ## 一级缓存常用API 一级缓存特点: 1. 当我们通过session的save,update saveOrupdate进行操作时,如果一级缓存中没有对象,会将这些对象从数据库中查询到,存储到一级缓存。 2. 当我们通过session的load,get,Query的list等方法进行操作时,会先判断一级缓存中是否存在,如果没有才会从数据库获取,并且将查询的数据存储到一级缓存中。 3. 当调用session的close方法时,session缓存清空。 clear 清空一级缓存. evict 清空一级缓存中指定的一个对象。 refresh重新查询数据库,用数据库中信息来更新一级缓存与快照 ![](https://box.kancloud.cn/fd38b545ab0b02a72ecbf2603db6dbbb_1113x631.png) 一级缓存也叫做session缓存,在一个hibernate session有效,这级缓存的可干预性不强,大多于hibernate自动管理,但它提供清除缓存的方法,这在大批量增加(更新)操作是有效果的,例如,同时增加十万条记录,按常规进行,很可能会出现异常,这时可能需要手动清除一级缓存,session.evict以及session.clear. # Hibernate常用API-Session补充 ## update udpate操作它主要是针对于脱管对象,持久对象具有自动更新能力。 问题1:如果我们直接操作的对象是一个脱管对象,执行update会出现什么情况? Update操作时,如果对象是一个脱管对象,可以操作,它会将脱管对象转换成持久对象在操作 如果在session中出现相同的oid两个对象,会产生异常 ![](https://box.kancloud.cn/ee6c5efd9e0c85a86eddd2ef9de2cefc_1129x51.png) 问题2脱管对象的oid如果在数据表中不存在,会报异常? ![](https://box.kancloud.cn/1160f2c2b872f62c3e783de860d84ca7_1115x81.png) 所以:在操作中,建议我们通过持久化对象来直接修改其操作。 ## saveOrUpdate 如果对象是一个瞬时对象 --------执行save操作 如果对象是一个脱管对象---------执行update 如果是一个持久对象-------直接返回 ## delete 删除一个脱管对象,与session关联,在删除 注意:如果执行delete操作,先删除一级缓存,在删除数据库中的数据。