Hibernate延迟加载
Hibernate在查询一个对象的时候,并没有发出sql语句去数据库中查询,而是当我们使用该对象的时候,才发出sql语句去数据库中真是的查询,就叫做延迟加载
1)Hibernate当中使用延迟加载的方法:
a、session.load():采用延迟加载
b、集合端的延迟加载
2)get()和load()的区别
相同点:都是根据id去查询对象
不同点:
a、对延迟加载是否支持
get()不支持延迟加载,查询对象的时候,立刻发出sql语句
load()支持延迟加载,当使用查询的对象的时候,才发出sql语句
b、返回的结果
get():返回的就是目标对象
load():返回是一个目标对象的子类对象(代理对象)
c、如果要查询的对象不存在
get():返回一个null
load():抛出异常:ObjectNotFoundException
3)延迟加载的原理
延迟加载的底层实现使用cglib动态代理实现的
cglib-2.1.3.jar
cglib动态代理:返回的是目标对象的子类对象
4)延迟加载是否可控?
a、在<class端 lazy默认是true:支持延迟加载 false :不支持延迟加载
b、集合端lazy的设置:
<set><list>
lazy=true(默认)/false/extra
true:set端依然支持延迟加载
false:当查询普通属性的时候,发出了两条sql语句,set端的延迟加载失效
extra:与true相似,但是相对只能
c、单端关联
<many-to-one 端lazy的设置
lazy:proxy/false
proxy:默认值,支持延迟加载
false:延迟加载失效