Hibernate对象的状态
临时状态/瞬时状态(transient):刚刚用new语句创建,没有被持久化,无id
不处于session中(没有使用session的方法去操作临时对象),该对象成为临时对象
持久化状态,托管状态(persistent):已经被持久化,加入session的缓存中,session是没有关闭
该状态的对象为持久化对象。
游离状态,脱管状态(detached):已经被持久化,但不处于session中,该状态的对象为游离对象。
删除状态(removed):对象有关联的id,并且在session管理下,但是已经被计划(事务提交的时候,commit)删除,如果没有事务就不能删除
相互转换
介绍一下Hibernate的缓存
答:一、why(为什么要用Hibernate缓存?)
Hibernate是一种持久化层框架,经常访问物理数据库。
为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能
缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
为了提高访问速度,把磁盘或者数据库访问变成内存访问
二、what(Hibernate缓存原理是怎样的?)Hibernate缓存包括两大类:Hibernate 一级缓存和Hibernate二级缓存
1. Hibernate一级缓存又称为”session的缓存”。
session缓存内置不能被卸载,session的缓存是事务范围的缓存(session对象的生命周期通常对应一个数据库事务或者一个应用事务)。
一级缓存中,持久化类的每个实例都具有唯一的OID
2. Hibernate的二级缓存又称为”sessionFactory的缓存”。
由于sessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。
第二级缓存是可选的,是一个可配置的插件,默认下sessionFactory不会启用这个插件。
什么样的数据适合存放到二级缓存中?
1) 很少被修改的数据 (帖子的最后回复时间)
2) 经常被查询的数据 (电商的地点)
3) 不是很重要的数据,允许出现偶尔并发的数据
4) 不会被并发访问的数据
5) 常量数据
扩展:Hibernate的二级缓存默认是不支持分布式缓存的,使用memcache,redis等中央缓存来代替二级缓存