hibernate lazy(延迟加载)

hibernate lazy策略可以使用在:
* <class>标签上,可以取值:true/false ,在hibernate3以上版本,默认是true
* <property>标签上,可以取值:true/false需要类增强工具
* <set><list>标签上,可以取值:true/false/extra
* <one-to-one><many-to-one>单端关联上,可以取值:false/proxy/no-proxy

lazy概念:只有真正使用该对象时,才会创建,对于hibernate而言,正真使用的时候才会发出sql

hibernate支持lazy策略只有在session打开状态下有效

1、在<class>标签上,可以取值:true/false ,在hibernate3以上版本,默认是true

     默认为true,可不写,在执行查询语句时不进行,比如session.load(id)时,不执行sql语句(session.get(id)不支持lazy),而是在具体获取参数时,执行sql语句,比如obj.getName()。

    <class>标签上的lazy特性只对普通属性起作用

    <class>标签上的lazy不会影响到单端关联上的lazy特性

2、<set><list>标签上,可以取值:true/false/extra
    lazy=true时,在获取对象的基本属性时,不进行set对象的查询,在获取set对象的具体属性时才进行查询,即在obj.getSet()不进行查询,obj.getSet().getName()时才进行查询

    lazy=false时,不延时,马上加载

    lazy=extra时,与=true时差不多(需要进一步验证

3、 <one-to-one><many-to-one>单端关联上,可以取值:false/proxy/no-proxy

    默认为lazy=proxy, 在获取关联对象时,不进行查询,在获取关联对象的具体实现时,才执行sql查询

    lazy=false时,不延时,马上加载

     many-to-one 的lazy设为proxy,当child.getParent().getName()或child.getParent().f()时,parent都会被抓取,若设为no-proxy,调用child.getParent().f()时,parent是不会被抓取的,同时这种方式需要编译时字节码增强,否则和proxy没区别。

."编译时字节码增强" 是什么意思?
"字节码增强"分编译期和运行期2种,编译期是修改java类编译后的class字节码文件,在上面附加“增强”操作

lazy (可选 - 默认为 proxy): 默认情况下,单点关联是经过代理的。lazy="no-proxy"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。 lazy="false"指定此关联总是被预先抓取。注意,如果constrained="false", 不可能使用代理,Hibernate会采取预先抓取!

猜你喜欢

转载自nvry.iteye.com/blog/1038659
今日推荐