Hibernate
Hibernate一级缓存
什么是一级缓存?
Hibernate创建每个Session对象时,都会给Session分配一块独立的缓存区,用于存放该Session查询出来的对象,
这个分配给Session的缓存区称之为一级缓存,也叫作session缓存
为什么使用一级缓存?
Session取数据时,会优先像向存区取数据,如果存在数据则直接返回,不存在才会去数据库中查询,从而降低数据库访问次数,
提高了代码运行效率.
如何使用一级缓存?
一级缓存是默认开启的,在使用Hibernate的API进行查询事会自动使用.
一级缓存规则?
一级缓存是Session独有的,每个Session不能访问其他的Session缓存区.
Session的save/update/delete/操作会触发缓存更新.
一级缓存管理?
session.evict(obj); 将obj从一级缓存中移除.
session.clear(); 清除一级缓存中的所有obj
session.close(); 关闭session,释放缓存空间
Hibernate中对象的状态
对象三种状态:
Hibernate中,可以把实体对象看成有三种状态:临时态/持久态/游离态
临时状态:
转换:
通过new创建的对象为临时态
通过delete方法操作的对象将转变为临时态
特征:
临时态的对象可以被垃圾回收.
临时态的对象未被持久化,未与session关联
持久状态:
转换:
通过get/load/list/iteratr方法查询到的对象为持久态.
通过save/update方法操作的对象转变为持久态
特征:
持久态对象垃圾回收器不能回收
持久态的对象进行了持久化,与session关联,实际上持久态对象存在于session缓存中,由session负责管理
持久态对象的数据可以自动更新到数据库中,时机是在调用session.flush()时执行,而提交事务时,也会调用session.flush(),
因此提交事务时也会触发同步,可以理解为ts.commit = session.flush()+commit;
游离态:
转换:
通过session的evict/clear/close方法操作的对象会转变为游离态.
特征:
游离态的对象可以被垃圾回收
游离态的对象进行过持久化,但已被session解除了关联
延迟加载
什么是延迟加载?
在使用某些Hibernate方法查询数据库时,Hibernate返回的只是一个空对象(除id外 属性都为null),并没有真正查询数据库,
而在使用这个对象时,才会触发查询数据库.
为什么使用延迟加载?
可以提升内存资源的使用率
可以降低对数据库的访问次数
采用了延迟加载的方法
session.load();
query.iterate();
关联映射中 对关联属性的加载
使用延时加载需要注意的问题:
采用具有延时加载机制的操作,需要避免session被提前关闭,避免适用对象之前关闭session
解决方法:
1.采用非延时加载的查询方法,如query.get()/session.list();等
2.在使用对象之后再关闭session
Open session in view
关联映射
什么是关联映射?
若两张表具有关联关系,我们可以在实体对象和映射关系文件中配置这种关系,然后使用Hibernate操作其中一张表时,
他可以通过配置关系自动帮我们操作到另一张表,这种通过配置自动操作另一张表的手段称之为关联映射
关联映射的作用?
当我们操作一张表的时候,Hibernate可以通过关联映射自动帮助我们操作其关系表
这种关联操作包括:
关联查询出关系表的数据
关联新增/修改关系表的数据
关联删除关系表的数据
关联映射的类型:
一对多关联
多对一关联
多对多关联
一对一关联
继承关联