Hibernate检索策略
一、类级别策略
(1)load方法
class元素上的lazy属性:
true(默认值): 懒加载.使用数据时才加载数据.
false:立即加载.无论是否使用.都会立即查询数据.
注意:使用懒加载时,load方法返回的代理对象,如果在session关闭之后才访问属 性.进行初始化.那么会抛出异常.提示没有Session.
结论: 确保数据的初始化工作要放到session关闭之前.
(2)get方法
不会应用查询策略.永远是立即加载
二、关联级别策略
(1)一对多|多对多(Set)
lazy属性: 决定集合数据的加载时机
true(默认值): 懒加载. 查询Customer时,并没有查询Customer下的Linkman集合.使用Linkman集合时才加载.
false: 立即加载. 查询Customer时, 无论是否使用.都会立即加载集合数据.
extra: 极其懒惰. 如果使用集合时,仅仅获得的是集合的长度.那么不会加载集合数据.只加载集合长度(count)
fetch属性: 决定管理数据的加载方式
select(默认值): 使用单表查询获得集合数据
join: 使用表链接(多表查询)获得customer数据以及对应集合数据. 因为会同时查询两方.所以lazy属性这时失效.
(2)多对一(引用)
lazy属性:决定加载的时机
false:立即加载
proxy(默认值): 由对方代我决定是否是懒加载. 由客户的类级别策略决定.
no-proxy: 不做研究.
fetch属性:决定使用什么sql语句加载
select(默认值): 单表查询加载关联数据.
join: 表连接同时加载两方数据. lazy属性无效.
总结:
尽量使用懒加载.尽量别用立即加载别用join加载方式. 如果使用立即加载或Join加载.考虑,业务中就需要显示图书列表.可能会加载出图书的作者信息等.加载出的信息可能是本次业务用不到的数据.消耗数据库资源还消耗了大量内存资源.
注意:项目中使用懒加载会出现no-session问题.
更多java、大数据学习面试资料,请扫码关注我的公众号: