Hibernate数据加载方式

数据加载方式:
在通过 JDBC 操作数据实,我们只能通过 SQL 语句来加载我们所需要的数据,但是到了 Hibernate 世界中(确切的说,是到了对象关系映射的世界中),由于有 O-R Mapping 的帮助,我们拥有了更多的自由以及更多的方法, Hibernate 总共有 4 种数据加载方式,分别是:即时加载,延迟加载,预先加载,批量加载,接下来我们分别讨论这四种加载方式,以及它们的使用方法,然后在下一节我们重点讨论延迟加载。
1、              即时加载:
  即时加载是指,当实体加载完成后,立即加载该实体所关联的数据。我们以前面讨论一对多关联映射的例子为例:客户和客户订购的货物是一对多的关系,所以我们在配置客户实体类的集合时采用了下面的配置:
<set name=”orders” table=”order” inverse=”true” cascade=”none” sort=”true”lazy=”false”>
 <key column=”c_id”/>
<one-to-many class=”com.neusoft.entity.Order”/>
</set>
我们注意,在 set 元素的 lazy 属性被设置为 true ,此时就启动了即时加载 , 看下面的代码:
String hql=”from Customer c where c.name=’zx’ ”;
List list=session.createQuery(hql).list();
System.out.println(“query finish….../n”);
Iterator it=list.iterator();
While(it.hasNext()){
 Customer customer=(Customer)it.next();
 Set set=customer.getOrders();
}
当我们运行上面的代码时,会生成如下类似的输出:
Select * from customer where name=’zx’;
Select * from order where id=’1’;
query finish…...
我们看到当执行查询 Customer 实体操作时,会自动加载它所关联的 Order 实体对象,因此会出现第二条查询语句,这就是即时加载的基本原理,当宿主实体加载时,会立即自动加载关联的实体对象,并完成关联实体对象的属性填充和实体对象的构造。
2、              延迟加载:
  在即时加载中,当加载 Customer 对象时,通过另一条查询语句自动加载了它所关联的实体对象,但是如果我们只需要 Customer 对象数据,而不需要它所关联的 Order 对象的数据,此时就造成了性能的无谓损耗。延迟加载机制的引入,使这个问题得到了化解。还以上面的例子为例,当我们想起用延迟加载机制时,我们要进行如下的配置:
<set name=”orders” table=”order” inverse=”true” cascade=”none” sort=”true”lazy=”true”>
 <key column=”c_id”/>
<one-to-many class=”com.neusoft.entity.Order”/>
</set>
set 元素的 lazy 属性设置成 true ,此时就启动了延迟加载,当我们再次运行上面的代码时,会生成如下的输出:
Select * from customer where name=’zx’;
query finish…...
Select * from order where id=’1’;
注意与即时加载不同,当我们执行查询 Customer 对象时,并没有立即加载它所关联的 Order 对象,只有执行确实获取关联的 Order 对象数据时,才会发起对关联对象的查询,这就是所谓的延迟加载机制,只有当确实需要获取关联数据时,才去真正加载关联对象。有关延迟加载的高级应用我们将在下一节中重点介绍。
3、              预先加载:
  要启用预先加载,必须如下配置:
<set name=”orders” table=”order” inverse=”true” cascade=”none” sort=”true” out-join=”auto”>
 <key column=”c_id”/>
<one-to-many class=”com.neusoft.entity.Order”/>
</set>
如我们所见,将 out-join 设置为 true ,这时就启用了预先加载,预先加载与即时加载不同,它是通过外连接来加载关联实体的,而不是通过两条查询语句来加载关联实体,如上配置当我们再次执行上面的代码时,会生成如下的输出:
Select * from customer c left outer join order o on c.id=o.id and c.name=’zx’;
4、              批量加载:
所谓批量加载,就是通过批量提交多个限定条件,一次完成多个数据的读取。比如我们有如下的 SQL 语句:
Select * from customer where id=’1’;
Select * from customer where id=’2’;
我们可以将以上两个 SQL 语句合并成如下形式:
Select * from customer where id=’1’ or id=’2’;
这就是批量加载的原理,当使用批量加载时, Hibernate 会自动在当前 session 中查找是否还有同类型的待加载的实体对象,如果有就将查询条件合并到当前的查询语句中,这样就通过一次数据库操作完成了多次读取任务,从而提高了读取性能。如果想启用批量加载,必须如下配置实体类的 class 元素:
<class name=”customer” table=”customer” batch-size=”5”>
通过指定 batch-size 属性的值,来指定批量加载尺寸以及启用批量加载,以上配置每次最多同时加载 5 个同类型实体对象。一般来说, batch-size 应该设置成一个合理的小的整数值。(一般设置成 <10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值