JAVA中关于hibernate的Lazy延时加载问题。

来源:百度知道 编辑:UC知道 时间:2024/05/13 03:38:16
为什么我设置为lazy="true"时,在查询时还是能查询出来子表中的数据呢?
我想问的是,当lazy="true"时就是延时加载了,我理解的意思就是不加载子表中的数据。可是为什么我还是在浏览器中打印出来了子表中的数据呢? 请高手指教这是为什么。

lazy="true"
表示刚开始的时候不加载子表数据。
直到你请求子表的数据,它才会加载子表数据。

否则,只要你的语句一创建,它就不管三七二十一,把所有的数据都取出来了。
也许你要的字段不是子表中的数据,但是它在缓冲区里已经有了字表数据。

参考资料:
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。下面我们就分别介绍这些种类的延迟加载的细节。A、实体对象的延迟加载:如果想对实体对象使用延迟加载,必须要在实体的映射配置文件中进行相应的配置,如下所示:
<hibernate-mapping><class name=”com.neusoft.entity.User” table=”user” lazy=”true”> ……</class></hibernate-mapping>
通过将class的lazy属性设置为true,来开启实体的延迟加载特性。如果我们运行下面的代码:User user=(User)session.load(User.class,”1”);(1)System.out.println(user.getName());(2)当运行到(1)处时,Hibernate并没有发起对数据的查询,如果我们此时通过一些调试工具(比如JBuilder2005的Debug工具),观察此时user对象的内存快照,我们会惊奇的发现,此时返回的可能是User$EnhancerByCGLIB$$bede8986类型的对象,而且其属性为null,这是怎么回事?还记得前面我曾讲过session.load()方法,会返回实体对象的代理类对象,这里所返回的对象类型就是User对象的代理类对象。在Hibernate中通过使用CGLIB,来实现动态构造一个目标对象的代理类对象,并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显示的内存快照,我们可以看出此时真正的User对象,是包含