<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<LINK href="../images/frame.css" rel=stylesheet type=text/css>
<title>无标题文档</title>
</head>
<body>
<DIV align=center>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 class=bg height=678
id=zz width=760>
<TBODY>
<TR>
<TD align=left class=spline height=437 rowSpan=4 vAlign=top width=47>
<DIV align=center></DIV></TD>
<TD align=left height=40 vAlign=top width=158><B><FONT face=ºÚÌå size=5><IMG border=0
height=58 src="../images/logo_jb-1.jpg"
width=153></FONT></B></TD>
<TD align=right colSpan=2 height=40 vAlign=top width=553>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 width="85%">
<TBODY>
<TR>
<TD>
<DIV align=right><B><FONT size=5><SPAN class=title-1><FONT
color=#ff0000 size=2>ACCP5.0</FONT><FONT color=#333333 size=2> OLTL </FONT></SPAN></FONT></B></DIV></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=left class=title2 colSpan=3 height=25 vAlign=center>
<DIV align=center class=title-1><SPAN class=title-1><FONT
size=3></FONT></SPAN></DIV></TD></TR>
<TR>
<TD align=left colSpan=3 height=494 vAlign=top><BR>
<TABLE align=center border=0 cellSpacing=0 cols=1 height=708 width=520>
<TBODY>
<TR>
<TD height=708 vAlign=top>
<div align="center"> <FONT size=3><SPAN class=title-3-1><B>Hibernate延时加载
2</B></SPAN></FONT></div>
<CENTER>
<HR width="100%">
<FONT style="FONT-SIZE: 9pt"></FONT>
<DIV align=left>
<div id="articleContent">
<div>
<center>
<h1> </h1>
</center>
<div>
<p><strong>二、集合类型的延迟加载</strong></p>
<p class="style5">Hibernate的延迟加载机制针对集合类型的应用意义是最重大的,因为这有可能使性能得到大幅度的提高。为此Hibernate进行了大量的努力,其中包括对JDK
Collection的进行了重新实现。我们在一对多关联中定义的用来容纳关联对象的Set集合,并不是java.util.Set类型或其子类型,而是net.sf.hibernate.collection.Set类型,通过使用自定义集合类的实现,Hibernate实现了集合类型的延迟加载。为了对集合类型使用延迟加载,我们必须如下配置我们的实体类的关于关联的部分:<br />
<hibernate-mapping><br />
<class name="com.neusoft.entity.User"
table="user"><br />
…..<br />
<set name="addresses" table="address"<strong>
lazy="true"</strong> inverse="true"><br />
<key column="user_id"/><br />
<one-to-many class="com.neusoft.entity.Arrderss"/><br />
</set><br />
</class><br />
</hibernate-mapping><br />
通过将<set>元素的lazy属性设置为true来开启集合类型的延迟加载特性。我们看下面的代码:<br />
User user=(User)session.load(User.class,"1");<br />
Collection addset=user.getAddresses(); (1)<br />
Iterator it=addset.iterator(); (2)<br />
while(it.hasNext()){<br />
Address address=(Address)it.next();<br />
System.out.println(address.getAddress());<br />
}<br />
当程序执行到(1)处时,这时并不会发起对关联数据的查询来加载关联数据,只有运行到(2)处时,真正的数据读取操作才会开始,这时Hibernate会根据缓存中符合条件的数据索引,来查找符合条件的实体对象。<br />
这里我们引入了一个全新的概念——数据索引,下面我们首先将接一下什么是数据索引。在Hibernate中对集合类型进行缓存时,是分两部分进行缓存的,首先缓存集合中所有实体的id列表,然后缓存实体对象,这些实体对象的id列表,就是所谓的数据索引。当查找数据索引时,如果没有找到对应的数据索引,这时就会一条select
SQL的执行,获得符合条件的数据,并构造实体对象集合和数据索引,然后返回实体对象的集合,并且将实体对象和数据索引纳入Hibernate的缓存之中。另一方面,如果找到对应的数据索引,则从数据索引中取出id列表,然后根据id在缓存中查找对应的实体,如果找到就从缓存中返回,如果没有找到,在发起select
SQL查询。在这里我们看出了另外一个问题,这个问题可能会对性能产生影响,这就是集合类型的缓存策略。如果我们如下配置集合类型:<br />
<hibernate-mapping><br />
<class name="com.neusoft.entity.User"
table="user"><br />
…..<br />
<set name="addresses" table="address"
lazy="true" inverse="true"><br />
<strong> <cache usage="read-only"/></strong><br />
<key column="user_id"/><br />
<one-to-many class="com.neusoft.entity.Arrderss"/><br />
</set><br />
</class><br />
</hibernate-mapping><br />
这里我们应用了<cache usage="read-only"/>配置,如果采用这种策略来配置集合类型,Hibernate将只会对数据索引进行缓存,而不会对集合中的实体对象进行缓存。如上配置我们运行下面的代码:<br />
User user=(User)session.load(User.class,"1");<br />
Collection addset=user.getAddresses(); <br />
Iterator it=addset.iterator(); <br />
while(it.hasNext()){<br />
Address address=(Address)it.next();<br />
System.out.println(address.getAddress());<br />
}<br />
System.out.println(“Second query……");<br />
User user2=(User)session.load(User.class,"1");<br />
Collection it2=user2.getAddresses();<br />
while(it2.hasNext()){<br />
Address address2=(Address)it2.next();<br />
System.out.println(address2.getAddress());<br />
}<br />
运行这段代码,会得到类似下面的输出:<br />
Select * from user where id=’1’;<br />
Select * from address where user_id=’1’;<br />
Tianjin<br />
Dalian<br />
Second query……<br />
Select * from address where id=’1’;<br />
Select * fr
评论0