Hibernate的懒加载解析

使用Load进行加载时,Hibernate会创建一个代理类,从原始类中继承,且此时Hibernate不会去访问数据库,而在第二次使用时才会去访问数据库.
 
因此可以立即初始化用户:
User user1= (User) session.load(UserClass,id);
Hibernate.initialize(user1);
System.out.println(user1.getClass);
 
原因:由于对数据库交互的过程耗费资源较多,
因此,使用懒加载时,Hibernate会延迟到用户真正需要这个值时,才会去访问,以便减少与数据库交互的次数,这样如果使用:if(user1 != null ) 则不会成立.因为这个user1是Hibernate临时创建的实例化对象.
 
而访问该user1,即Hibernate的代理对象,必须是在session关闭之前,才能正常访问.
 
懒加载:
通过asm和cglib两个包实现;domain是非final修饰的.
1.session.load实现懒加载
2.one-to-one(元素)懒加载
    必须同时满足3个条件:主表不能有constrained=true,lazy!=false;fetch=select
 
3.one-to-many(元素)懒加载: lazy!=false;fetch=select
4.many-to-one:lazy!=false;fetch=select
5.many-to-many: lazy!=false;fetch=select
6.能够懒加载的对象都是被改写过的代理对象,当关联的session没有关闭时,访问懒加载对象(即代理对象)的属性,getId和getClass除外,Hibernate会立即初始化这些代理,或者使用Hibernate.initialize(proxy)来初始化代理对象,当关联的session关闭之后,再访问懒加载则会出现异常.
 
lazy= 什么时候捉取
fetch= 捉取方式:select=关联查询;join=连接表的方式查询(效率高)
 
fetch=join时,lazy的设置将没有意义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值