欢迎来到天天文库
浏览记录
ID:40554951
大小:39.00 KB
页数:7页
时间:2019-08-04
《hibernate懒加载策略》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、所谓懒加载(lazy)就是延时加载至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少并发量,减少系统资源的消耗,我们让数据在需要的时候才进行加载,这时我们就用到了懒加载。hibernate3.0中lazy有三个值,true,false,proxy,默认的是lazy="proxy".比如部门ENTITY和员工ENTITY,部门与员工1对多,如果lazy设置为false,那么只要加载了一个部门的po,就会根据一对多配置的关系把所有员工的po也加载出来。但是实际上有时候只是需要用到部门的信息,不需要用到员工的信息,这时员工po的加载
2、就等于浪费资源。如果lazy设置为true,那么只有当你访问部门po的员工信息时候才回去加载员工的po的信息。延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。A、实体对象的延迟加载如果想对实体对象使用延迟加载,必须要在实体的映射配置文件中进行相应的配置,如下所示:3、ser"lazy="true">U_ID 通过将class的lazy属性设置为true
3、ser"lazy="true">U_ID
4、,来开启实体的延迟加载特性。如果我们运行下面的代码: Useruser=(User)session.load(User.class,”1”); System.out.println(user.getName());观察此时user对象的内存快照,会惊奇的发现,此时返回的可能是User$EnhancerByCGLIB$$bede8986类型的对象,而且其属性为null,这是怎么回事?session.load()方法会返回实体对象的代理类对象,这里所返回的对象类型就是User对象的代理类对象。在Hibernate中通过使用CGLIB,来实现动态构造一个目标对象的代理类对象,
5、并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显示的内存快照,可以看出此时真正的User对象,是包含在代理对象的CGLIB$CALBACK_0.target属性中,当代码运行到(2)处时,此时调用user.getName()方法,这时通过CGLIB赋予的回调机制,实际上调用CGLIB$CALBACK_0.getName()方法,当调用该方法时,Hibernate会首先检查CGLIB$CALBACK_0.target属性是否为null,如果不为空,则调用目标对象的getName方法,如果为空,则会发起数据库查询,生成类似这样的SQL语句
6、:select*fromuserwhereid=’1’;来查询数据,并构造目标对象,并且将它赋值到CGLIB$CALBACK_0.target属性中。 这样,通过一个中间代理对象,Hibernate实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。所以实体的延迟加载是用通过中间代理类完成的,所以只有session.load()方法才会利用实体延迟加载,因为只有session.load()方法才会返回实体类的代理类对象。B、集合类型的延迟加载 在Hibernate的延迟加载机制中,针对集合类型的应用,意义是最为重大的,因为这有可能使
7、性能得到大幅度的提高,为此Hibernate进行了大量的努力,其中包括对JDKCollection的独立实现,在一对多关联中,定义的用来容纳关联对象的Set集合,并不是java.util.Set类型或其子类型,而是net.sf.hibernate.collection.Set类型,通过使用自定义集合类的实现,Hibernate实现了集合类型的延迟加载。为了对集合类型使用延迟加载,必须如下配置实体类的关于关联的部分:
此文档下载收益归作者所有