Hibernate的懒加载解析

来源:互联网 发布:布莱克书店知乎 编辑:程序博客网 时间:2024/05/16 16:16
使用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的设置将没有意义
原创粉丝点击