Hibernate检索策略

来源:互联网 发布:店淘宝客怎么一键复制 编辑:程序博客网 时间:2024/05/13 11:09

 检索策略:立即检索,延时检索,批量立即检索,批量延迟检索,迫切左外连接检索

一.类级别的检索策略
分为:立即检索和延时检索
配置:<class lazy="true"> true延时加载(moren) false立即检索
使用对象:Session中的load()方法,get()和find()无效
延时加载实现:执行load()时,Hibernate不会立即执行User的select,只会返回User的代理类;
代理类特征:1.Hibernate动态执行,继承User,继承User所有属性和方法,但它对程序是透明的.
           2.User的代理类实例仅仅初始了OID属性,其他属性都为null,因此占内存少.
           3.当程序第一次访问其他属性(如:getXXX()或user.setXXX())时,Hibernate会初始化代理类实例,会执行User的select,真正                    从数据库中加载数据.
             所以第一此访问OID时Hibernate不会访初始化代理类(即:不会问数据库),因为在创建代理实例类OID已经初始了.

二.1->N和N->N检索
立即检索:
1->N和N->N默认检索策略为立即检索

延时检索:
对于Set元素节,考虑用延迟检索

批量立即检索和批量延迟检索:
通过设置set元素中的batch-size属性

迫切左外连接检索:
设置set元素中的out-join属性为true


在<set>中设置lazy="true"(默认):
表示检索一对多(1->N)中的多(N) 或 多对多(N->N)中的多(N) 检索延时,当调用到iterator时才检索.
如:一个User有多个Addr 配置User.hbm.xml中的<set name="addrs" table="tb_addr" lazy="true">
在<set>中设置lazy="false":表示立即检索,集合Set
延时加载实现:User中拿的是Addr的集合代理实例类(不是Addr的代理实例类),当调用到iterator时才检索(到数据库中select).

三.N->1和1->1检索策略
立即检索:


延时检索:
对于Set元素节,考虑用延迟检索

批量立即检索和批量延迟检索:
通过设置set元素中的batch-size属性

迫切左外连接检索:
设置set元素中的out-join属性为true
N->1和1->1默认检索策略为立即检索

原创粉丝点击