hibernate中lazy的使用 lazy,延迟加载 Lazy的有效期:只有在session打开的时候才有效;session关闭后lazy就没效了。 lazy策略可以用在: * 标签上:可以取值true/false * 标签上,可以取值true/false,这个特性需要类增强 * /等集合上,可以取值为true/false/extra * /等标签上,可以取值false/proxy/no-proxy 6.1 get和load的区别: * get不支持延迟加载,而load支持。 * 当查询特定的数据库中不存在的数据时,get会返回null,而load则抛出异常。 6.2 类(Class)的延迟加载: * 设置标签中的lazy="true",或是保持默认(即不配置lazy属性) * 如果lazy的属性值为true,那么在使用load方法加载数据时,只有确实用到数据的时候才会发出sql语句;这样有可能减少系统的开销。 * //不会发出查询sql System.out.println("group id=" + group.getId()); 这里有一个问题,为什么加载主键的时候不需要发出sql语句。 6.3 集合(collection)的延迟加载:可以取值true,false,extra * 保持集合上的lazy的默认值,此时的效果和lazy="extra"是基本一样的。 * 设置集合上的lazy=extra,此时的效果和lazy属性的默认值是基本一样的。但是推荐使用这个属性值,因为在统计时这种情况显得比较智能。当然延迟是有效果的。 * 设置集合上的lazy=false true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据 false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据 extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate 并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据 6.4 Hibernate单端关联懒加载策略:即在/标签上可以配置 懒加载策略。可以取值为:false/proxy/no-proxy false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象 proxy:这是hibernate对单端关联的默认懒加载策略,即只有在调用到其关联对象的方法的时候才真正发出查询语句查询其对象数据,其关联对象是代理类 no-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其关联对象不是代理类 注意:在class标签上配置的lazy属性不会影响到关联对象!!! 注:在修改lazy= "false"时,不要只是修改映射关系第一行,还要修改相关的set集合等 hibernate3.0中lazy有三个值,true,false,proxy,默认的是lazy="proxy". 具体设置成什么要看你的需求,并不是说哪个设置就是最好的。 假如在student对象中包含一个head对象 如果你确定在用student对象的时候就要用到head对象里的属性,那你就设置立即加载,因为设置立即加载那么在查询student的同时就会查询student的head,hibernate就会在查询的时候关联两张表从而生成的sql就可能只有一条。而如果你设置的是延迟加载,那么肯定会要生成1+N条sql语句:其中“1”是查询student的语句,“N”是根据N个student的id去查询head的N条语句。而且,延迟加载是要用到的时候才去执行查询,这样系统判断那里需要加载,那里不需要加载也需要时间,性能上肯定就不如立即加载了! 如果,你是有的地方需要用到student的时候才用到head属性,那么你就设置成延迟加载,因为查询2张表的数据肯定要比查询1张表的数据消耗大。 到低要怎样设置就要看你的实际需求了