Hibernate检索策略

一、类级别策略

(1)load方法

class元素上的lazy属性:

Hibernate关联级别策略_懒加载

true(默认值): 懒加载.使用数据时才加载数据.

false:立即加载.无论是否使用.都会立即查询数据.

注意:使用懒加载时,load方法返回的代理对象,如果在session关闭之后才访问属 性.进行初始化.那么会抛出异常.提示没有Session.

结论: 确保数据的初始化工作要放到session关闭之前.

(2)get方法

不会应用查询策略.永远是立即加载

二、关联级别策略

(1)一对多|多对多(Set)

Hibernate关联级别策略_懒加载_02

lazy属性: 决定集合数据的加载时机

true(默认值): 懒加载. 查询Customer时,并没有查询Customer下的Linkman集合.使用Linkman集合时才加载.

false: 立即加载. 查询Customer时, 无论是否使用.都会立即加载集合数据.

extra: 极其懒惰. 如果使用集合时,仅仅获得的是集合的长度.那么不会加载集合数据.只加载集合长度(count)

fetch属性: 决定管理数据的加载方式

select(默认值): 使用单表查询获得集合数据

join: 使用表链接(多表查询)获得customer数据以及对应集合数据. 因为会同时查询两方.所以lazy属性这时失效.

(2)多对一(引用)

Hibernate关联级别策略_Hibernate_03

lazy属性:决定加载的时机

false:立即加载

proxy(默认值): 由对方代我决定是否是懒加载. 由客户的类级别策略决定.

no-proxy: 不做研究.

fetch属性:决定使用什么sql语句加载

select(默认值): 单表查询加载关联数据.

join: 表连接同时加载两方数据. lazy属性无效.

总结:

尽量使用懒加载.尽量别用立即加载别用join加载方式. 如果使用立即加载或Join加载.考虑,业务中就需要显示图书列表.可能会加载出图书的作者信息等.加载出的信息可能是本次业务用不到的数据.消耗数据库资源还消耗了大量内存资源.

注意:项目中使用懒加载会出现no-session问题.

Hibernate关联级别策略_Hibernate_04