检索策略
检索数据时注意问题:
1 不浪费内存
2 提高查询效率,发送更少的SQL语句
检索策略(默认延迟检索)
立即检索: 立即加载检索方法指定的对象
延迟检索: 延迟加载检索方法指定的对象。在使用具体的属性时,再进行加载,lazy 属性
无论 <class> 元素的 lazy 属性是 true 还是 false, Session 的 get() 方法及 Query 的 list() 方法在类级别总是使用立即检索策略。
lazy: 主要决定 orders 集合被初始化的时机.
fetch: 取值为 “select” 或 “subselect” 时, 决定初始化 orders 的查询语句的形式; 若取值为”join”, 则决定 orders 集合被初始化的时机
<set> 元素的 lazy 和 fetch 属性:
延迟加载时,初始化集合代理类实例:
1 通过 Hibernate.initialize() 静态方法显式初始化
2 应用程序第一次访问集合属性: iterator(), size(), isEmpty(), contains() 等方法
增强延迟检索(lazy 属性为 extra): 与 lazy=“true” 类似. 主要区别是增强延迟检索策略能进一步延迟 Customer 对象的 orders 集合代理实例的初始化时机
<set> 元素有一个 batch-size 属性, 用来为延迟检索策略或立即检索策略设定批量检索的数量.
Hibernate 提供了以下几种检索对象的方式:
1 导航对象图检索方式: 根据已经加载的对象导航到其他对象
2 OID 检索方式: 按照对象的 OID 来检索对象
3 HQL 检索方式: 使用面向对象的 HQL 查询语言
4 QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符
5串形式的查询语句, 提供了更加面向对象的查询接口.
6本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句
二级缓存
Hibernate中提供了两个级别的缓存
第一级别的缓存是 Session 级别的缓存,它是属于事务范围的缓存。这一级别的缓存由 hibernate 管理的
第二级别的缓存是 SessionFactory 级别的缓存,它是属于进程范围的缓存
SessionFactory 缓存分类:
内置缓存: Hibernate 自带的, 不可卸载.
外置缓存(二级缓存): 一个可配置的缓存插件.
I. 配置启用 hibernate 的二级缓存
<property name="cache.use_second_level_cache">true</property>
II. 配置hibernate二级缓存使用的产品
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
III. 配置对哪些类使用 hibernate 的二级缓存
<class-cache usage="read-write" class="com.**.Employee"/>
2). 集合级别的二级缓存的配置
I. 配置对集合使用二级缓存
<collection-cache usage="read-write" collection="com.**.emps"/>
也可以在 .hbm.xml 文件中进行配置
<set name="emps" table="GG_EMPLOYEE" inverse="true" lazy="true">
<cache usage="read-write"/>
<key>
<column name="DEPT_ID" />
</key>
<one-to-many class="com.**.Employee" />
</set>
II. 注意: 还需要配置集合中的元素对应的持久化类也使用二级缓存! 否则将会多出 n 条 SQL 语句.
查询缓存: 默认情况下, 设置的缓存对 HQL 及 QBC 查询时无效的, 但可以通过以下方式使其是有效的
<property name="cache.use_query_cache">true</property>
Session
三种管理 Session 对象的方法:
Session 对象的生命周期与本地线程绑定
Session 对象的生命周期与 JTA 事务绑定
Hibernate 委托程序管理 Session 对象的生命周期
hibernate.current_session_context_class 属性用于指定 Session 管理方式, 可选值包括
thread: Session 对象的生命周期与本地线程绑定
jta*: Session 对象的生命周期与 JTA 事务绑定
managed: Hibernate 委托程序来管理 Session 对象的生命周期