现在的位置: 首页 > 综合 > 正文

Hibernate数据加载方式

2012年02月23日 ⁄ 综合 ⁄ 共 2433字 ⁄ 字号 评论关闭
 

数据加载方式:
在通过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
 

 

抱歉!评论已关闭.