﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Kira-2006-文章分类-hibernate</title><link>http://www.blogjava.net/Kira-2006/category/31064.html</link><description>-仅仅是一阵风也罢了,偏偏是这样永恒,  仅仅是一场梦也罢了,偏偏是如此的真实,</description><language>zh-cn</language><lastBuildDate>Wed, 28 May 2008 13:51:09 GMT</lastBuildDate><pubDate>Wed, 28 May 2008 13:51:09 GMT</pubDate><ttl>60</ttl><item><title>深入浅出Hibernate读书笔记--Hibernate常见优化策略</title><link>http://www.blogjava.net/Kira-2006/articles/203632.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Wed, 28 May 2008 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/Kira-2006/articles/203632.html</guid><wfw:comment>http://www.blogjava.net/Kira-2006/comments/203632.html</wfw:comment><comments>http://www.blogjava.net/Kira-2006/articles/203632.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kira-2006/comments/commentRss/203632.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kira-2006/services/trackbacks/203632.html</trackback:ping><description><![CDATA[Hibernate一些常用的优化策略：<br />
1. 在允许的情况下，选用最新版本的Hibernate的发行版。<br />
2. 制定合理的缓存策略。<br />
3. 采用合理的Session管理机制。<br />
4. 尽量使用延迟加载特性。<br />
5. 设定合理的批处理参数(batch_size)。<br />
6. 如果可能，选用UUID作为主键生成器。<br />
7. 如果可能，选用基于version的乐观锁策略替代悲观锁。<br />
8. 开发过程中，打开Hibernate的SQL日志输出，通过观察Hibernate生成的sql语句进一步了解实现原理，从而指定更好的实现策略。
<img src ="http://www.blogjava.net/Kira-2006/aggbug/203632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Kira-2006/" target="_blank">Kira-2006</a> 2008-05-28 20:37 <a href="http://www.blogjava.net/Kira-2006/articles/203632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出Hibernate学习笔记--Criteria Query</title><link>http://www.blogjava.net/Kira-2006/articles/199774.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Sat, 10 May 2008 14:59:00 GMT</pubDate><guid>http://www.blogjava.net/Kira-2006/articles/199774.html</guid><wfw:comment>http://www.blogjava.net/Kira-2006/comments/199774.html</wfw:comment><comments>http://www.blogjava.net/Kira-2006/articles/199774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kira-2006/comments/commentRss/199774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kira-2006/services/trackbacks/199774.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; Criteria Query通过面向对象的设计，将数据查询条件封装为一个对象。简单来说，Criteria Query可以看作是传统SQL的对象化表示，如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Criteria&nbsp;criteria</span><span style="color: #000000">=</span><span style="color: #000000">session.createCriteria(TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />criteria.add(Expression.eq(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Erica</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />criteria.add(Expression.eq(</span><span style="color: #000000">"</span><span style="color: #000000">sex</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">1</span><span style="color: #000000">));</span></div>
这里的criteria实例本质上是对SQL&#8220;select * from t_user where name='Erica' and sex=1&#8221;的封装。<br />
Hibernate在运行期会根据Criteria中指定的查询条件生成相应的SQL语句。<br />
<br />
<strong>Criteria查询表达式<br />
</strong>&nbsp;&nbsp;&nbsp; Criteria本身只是一个容器，具体的查询条件要通过Criteria.add方法添加到Criteria实例中。<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>方法</td>
            <td>描述</td>
        </tr>
        <tr>
            <td>Expression.eq</td>
            <td>
            <p>对应SQL &#8220;field=value&#8221;表达式</p>
            <p>如：Expression.eq("name","Erica")</p>
            </td>
        </tr>
        <tr>
            <td>Expression.allEq</td>
            <td>参数为一个Map对象，其中包含了多个属性-值对应关系。相当于多个Expression.eq关系的叠加</td>
        </tr>
        <tr>
            <td>Expression.gt</td>
            <td>对应SQL&#8220;field&gt;value&#8221;表达式</td>
        </tr>
        <tr>
            <td>Expression.ge</td>
            <td>对应SQL&#8220;field&gt;=value&#8221;表达式</td>
        </tr>
        <tr>
            <td>Expression.lt</td>
            <td>对应SQL&#8220;field&lt;value&#8221;表达式</td>
        </tr>
        <tr>
            <td>Expression.le</td>
            <td>对应SQL&#8220;field&lt;=value&#8221;表达式</td>
        </tr>
        <tr>
            <td>Expression.between</td>
            <td>
            <p>对应SQL&#8220;between&#8221;表达式</p>
            <p>如：Expression.between("age",new Integer(13),new Integer(50));</p>
            </td>
        </tr>
        <tr>
            <td>Expression.like</td>
            <td>对应SQL"field like valule"表达式</td>
        </tr>
        <tr>
            <td>Expression.in</td>
            <td>对应SQL&#8220;field in...&#8221;表达式</td>
        </tr>
        <tr>
            <td>Expression.eqproperty</td>
            <td>用于比较两个属性之间的值，对应SQL&#8220;field&gt;field&#8221;</td>
        </tr>
        <tr>
            <td>Expression.gtProperty</td>
            <td>用于比较两个属性之间的值，对应SQL&#8220;field&gt;=field&#8221;</td>
        </tr>
        <tr>
            <td>Expression.ltProperty</td>
            <td>用于比较两个属性之间的值，对应SQL"field&lt;field"</td>
        </tr>
        <tr>
            <td>Expression.leProperty</td>
            <td>用于比较两个属性之间的值，对应SQL"field&lt;=field"</td>
        </tr>
        <tr>
            <td>Expression.and</td>
            <td>
            <p>and关系组合，如：</p>
            <p>Expression.add(Expression.eq("name","Erica"),Expression.add("sex",new Integer(1)))</p>
            </td>
        </tr>
        <tr>
            <td>Expression.or</td>
            <td>
            <p>or关系组合，如：</p>
            <p>Expression.or(Expression.eq("name","Erica"),Expression.add("sex",new Integer(1)))</p>
            </td>
        </tr>
        <tr>
            <td>Expression.sql</td>
            <td>
            <p>作为补充，本方法提供了原生SQL语法的支持，我们可以通过这个方法直接通过SQL语句限定查询条件</p>
            <p>下面的代码返回所有名称以"Erica"其实的记录：<br />
            Expression.sql("lower({alias}.name) like lower(?)","Erica%",Hibernate.STRING);<br />
            其中的"{alias}"将Hibernate在运行期使用当前关联的POJO别名替换</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
在Hibernate3中，引入了Restrictions类作为Expression的替代。<br />
<br />
<strong>示例查询<br />
</strong>&nbsp;&nbsp;&nbsp; Example类实现了Criteria接口，同样，它也可以用作Criteria的查询条件。Example的作用是：根据已有对象，查找属性与之相符的其他对象。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Criteria&nbsp;criteria</span><span style="color: #000000">=</span><span style="color: #000000">session.CreateCriteria(TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />TUser&nbsp;exampleUser</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TUser();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />exapleUser.getName(</span><span style="color: #000000">"</span><span style="color: #000000">Erica</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />criteria.add(Example.create(exampleUser));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />List</span><span style="color: #000000">&lt;</span><span style="color: #000000">TUser</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list</span><span style="color: #000000">=</span><span style="color: #000000">criteria.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_214_252_Open_Image" onclick="this.style.display='none'; Codehighlighter1_214_252_Open_Text.style.display='none'; Codehighlighter1_214_252_Closed_Image.style.display='inline'; Codehighlighter1_214_252_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_214_252_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_214_252_Closed_Text.style.display='none'; Codehighlighter1_214_252_Open_Image.style.display='inline'; Codehighlighter1_214_252_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">for</span><span style="color: #000000">(TUser&nbsp;user:list)</span><span id="Codehighlighter1_214_252_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_214_252_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />System.out.println(user.getName());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
新建一个TUser对象exampleUser，并作为范本，查询所有name属性与之相同的记录。<br />
<br />
<strong>复合查询<br />
</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Criteria&nbsp;criteria</span><span style="color: #000000">=</span><span style="color: #000000">session.createCriteria(TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: red">Criteria&nbsp;addrCriteria=criteria.createCriteria("addresses");<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />addrCriteria.add(Expression.like("addresses","%shanghai%"));</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />List</span><span style="color: #000000">&lt;</span><span style="color: #000000">TUser</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;criteria.list();<br />
<img id="Codehighlighter1_233_407_Open_Image" onclick="this.style.display='none'; Codehighlighter1_233_407_Open_Text.style.display='none'; Codehighlighter1_233_407_Closed_Image.style.display='inline'; Codehighlighter1_233_407_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_233_407_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_233_407_Closed_Text.style.display='none'; Codehighlighter1_233_407_Open_Image.style.display='inline'; Codehighlighter1_233_407_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">for</span><span style="color: #000000">(TUser&nbsp;user:list)</span><span id="Codehighlighter1_233_407_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_233_407_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(user.getName());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">TAddress</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;addrSet</span><span style="color: #000000">=</span><span style="color: #000000">user.getAddresses();<br />
<img id="Codehighlighter1_352_405_Open_Image" onclick="this.style.display='none'; Codehighlighter1_352_405_Open_Text.style.display='none'; Codehighlighter1_352_405_Closed_Image.style.display='inline'; Codehighlighter1_352_405_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_352_405_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_352_405_Closed_Text.style.display='none'; Codehighlighter1_352_405_Open_Image.style.display='inline'; Codehighlighter1_352_405_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(TAddress&nbsp;addr:addrSet)</span><span id="Codehighlighter1_352_405_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_352_405_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(addr.getAddress());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
红色部分就是我们新增的复合查询条件，可以看到，我们可以通过Criteria.createCriteria方法在原有Criteria对象的基础上构建复合查询。<br />
<br />
<strong>DetachedCriteria<br />
</strong>&nbsp;&nbsp;&nbsp;Hibernate2中，Criteria生命周期位于其宿主Session生命周期中，也就是说，由某个session创建的Criteria实例，一旦session销毁，那么此Criteria实例也随之失效。<br />
&nbsp;&nbsp;&nbsp; Hibernate3中引入了DetachedCriteria，DetachedCriteria可以脱离session实例独立存在，这样，我们就可以将某些通用的Criteria查询条件进行抽离，每次使用时再与当前session实例绑定以获得更好的代码重用效果。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">DetachedCriteria&nbsp;deCriteria</span><span style="color: #000000">=</span><span style="color: #000000">DetachedCriteria.forClass(TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />deCriteria.add(Expression.eq(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Erica</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />deCriteria.add(Expression.eq(</span><span style="color: #000000">"</span><span style="color: #000000">sex</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">1</span><span style="color: #000000">)));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: red">Criteria&nbsp;criteria=deCriteria.getExecutableCriteria(session);<br />
</span></span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />List</span><span style="color: #000000">&lt;</span><span style="color: #000000">TUser</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list</span><span style="color: #000000">=</span><span style="color: #000000">criteria.list();<br />
<img id="Codehighlighter1_284_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_284_326_Open_Text.style.display='none'; Codehighlighter1_284_326_Closed_Image.style.display='inline'; Codehighlighter1_284_326_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_284_326_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_284_326_Closed_Text.style.display='none'; Codehighlighter1_284_326_Open_Image.style.display='inline'; Codehighlighter1_284_326_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">for</span><span style="color: #000000">(TUser&nbsp;user:list)</span><span id="Codehighlighter1_284_326_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_284_326_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(user.getName());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
DetachedCriteria的生存周期与session实例无关，我们可以独立创建DetachedCriteria实例，并在需要使用时与session相绑定，从而获得运行期Criteria实例。这样，我们就可以将查询逻辑和Criteria实例分离，以获得最大化代码的重用效果。<br />
&nbsp;&nbsp;&nbsp; DetachedCriteria也可以用于子查询表达：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: red; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">DetachedCriteria&nbsp;aveAge</span><span style="color: #000000">=</span><span style="color: #000000">DetachedCriteria.forClass(TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />avgAge.setProjection(Projections.avg(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Criteria&nbsp;criteria</span><span style="color: #000000">=</span><span style="color: #000000">session.createCriteria(TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: red">criteria.add(Subqueries.propertyGT("age",avgAge));</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
通过Subqueries我们可以将DetachedCriteria纳入查询表达式，反映在SQL上则是一个典型的子查询语句。上例生成的SQL语句大致如：select ... from T_User where age &gt; (select avg(age) from T_User)<br />
<br />
<strong>Criteria高级特性<br />
</strong>&nbsp;&nbsp;&nbsp; <strong>限定返回的记录范围</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过criteria.setFirstResult/setMaxResults方法可以限制一次查询返回的记录范围：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Criteria&nbsp;criteria</span><span style="color: #000000">=</span><span style="color: #000000">session.createCriteria(TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">限定查询返回检索结果中，从100条结果开始的20条记录</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">criteria.setFirstResult(</span><span style="color: #000000">100</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />criteria.setMaxResults(</span><span style="color: #000000">20</span><span style="color: #000000">);</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记录排序：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">Criteria&nbsp;criteria</span><span style="color: #000000">=</span><span style="color: #000000">session.createCriteria(TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />criteria.add(Expression.eq(</span><span style="color: #000000">"</span><span style="color: #000000">groupId</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">2</span><span style="color: #000000">)));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />criteria.addOrder(Order.asc(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />criteria.addOrder(Order.desc(</span><span style="color: #000000">"</span><span style="color: #000000">groupId</span><span style="color: #000000">"</span><span style="color: #000000">));</span></div>
<br />
&nbsp;&nbsp;&nbsp; <strong>分组与统计<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Hibernate3中，我们还可以通过Criteria完成分组和统计。分组、统计表达式由Hibernate3新引入的Projections Class进行封装。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Criteria&nbsp;criteria</span><span style="color: #000000">=</span><span style="color: #000000">session.createCriteria(TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: red">criteria.setProjection(Projections.groupProperty("age"));</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />List</span><span style="color: #000000">&lt;</span><span style="color: #000000">TUser</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list</span><span style="color: #000000">=</span><span style="color: #000000">criteria.list();<br />
<img id="Codehighlighter1_168_200_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_200_Open_Text.style.display='none'; Codehighlighter1_168_200_Closed_Image.style.display='inline'; Codehighlighter1_168_200_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_168_200_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_168_200_Closed_Text.style.display='none'; Codehighlighter1_168_200_Open_Image.style.display='inline'; Codehighlighter1_168_200_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">for</span><span style="color: #000000">(TUser&nbsp;user:list)</span><span id="Codehighlighter1_168_200_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_168_200_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(user);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p>上例对当前的TUser记录按照年龄进行分组。通过Projections.groupProperty方法，我们指定了用于分组的目标属性&#8220;age&#8221;。生成的SQL语句：select this.age as&nbsp;y0_ from T_User this_group by this_.age。<br />
&nbsp;&nbsp;&nbsp; 另外，对于多条件组合的统计、分组功能，我们可以借助ProjectionList完成，下面的例子中，我们统计了各个年龄层次中的用户数量：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">ProjectionList&nbsp;projectionlist</span><span style="color: #000000">=</span><span style="color: #000000">Projections.ProjectionList();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />projectionList.add(Projections.groupProperty(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />projectionList.add9Projections.rowCount());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Criteria&nbsp;criteria</span><span style="color: #000000">=</span><span style="color: #000000">session.createCriteria(TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />criteria.setProjection(projectionList);</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/Kira-2006/aggbug/199774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Kira-2006/" target="_blank">Kira-2006</a> 2008-05-10 22:59 <a href="http://www.blogjava.net/Kira-2006/articles/199774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出Hibernate学习笔记--数据关联</title><link>http://www.blogjava.net/Kira-2006/articles/199736.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Sat, 10 May 2008 12:08:00 GMT</pubDate><guid>http://www.blogjava.net/Kira-2006/articles/199736.html</guid><wfw:comment>http://www.blogjava.net/Kira-2006/comments/199736.html</wfw:comment><comments>http://www.blogjava.net/Kira-2006/articles/199736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kira-2006/comments/commentRss/199736.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kira-2006/services/trackbacks/199736.html</trackback:ping><description><![CDATA[<p><strong>一对一关联<br />
&nbsp;&nbsp;&nbsp;&nbsp;主键关联：</strong>即两张表通过主键形成一对一映射关系。</p>
&nbsp;&nbsp;&nbsp;&nbsp;用户TUser与护照TPassport关联<br />
&nbsp;&nbsp;&nbsp; TUer.hbm.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">hibernate-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="<img alt="" src="http://www.blogjava.net/Images/dot.gif" />TUser"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="T_User"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">one-to-one&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="passport"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="<img alt="" src="http://www.blogjava.net/Images/dot.gif" />TPassport"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cascade</span><span style="color: #0000ff">="all"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outer-join</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">hibernate-mapping</span><span style="color: #0000ff">&gt;</span></div>
cascade="all"表示级联关系设置为&#8220;all&#8221;，即无论主空房执行任何操作，都会关联类执行相同的操作。<br />
<br />
&nbsp;&nbsp;&nbsp; TPassport.hbm.xml<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">hibernate-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="<img alt="" src="http://www.blogjava.net/Images/dot.gif" />TPassport"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="T_Passport"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">one-to-one<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="user"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="<img alt="" src="http://www.blogjava.net/Images/dot.gif" />TUser"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constrain</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />.<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">hibernate-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
constrain必须设定为&#8220;true&#8221;，以告知Hibernate当前主键上存在一个约束。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 测试代码：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">TUser&nbsp;user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TUser();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />user.setAge(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">20</span><span style="color: #000000">));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />user.setName(</span><span style="color: #000000">"</span><span style="color: #000000">Carin</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />TPassport&nbsp;passport&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TPassport();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />passport.setSerial(</span><span style="color: #000000">"</span><span style="color: #000000">PCN759386</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />passport.setExpiry(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">20080101</span><span style="color: #000000">));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">相互设置关联</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">passport.setUser(user);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />user.setPassport(passport);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Transaction&nbsp;tx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sessioin.beginTransaction();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">由于TUser类的one-to-one节点被设置成<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">cascade=&#8220;all&#8221;其关联的passport对象将被级联保存</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">session.save(user);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />tx.commit();</span></div>
&nbsp;&nbsp;&nbsp; 以下代码完成关联对象的读取：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">TUser&nbsp;user</span><span style="color: #000000">=</span><span style="color: #000000">(TUser)Hibernate.load(TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">15</span><span style="color: #000000">));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">User&nbsp;name=&gt;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">user.getName());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Passport&nbsp;Serial=&gt;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">user.getPassport().getSerial());</span></div>
&nbsp;&nbsp;&nbsp; 控制台输出：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Hibernate:select&nbsp;tuser0_.id&nbsp;as&nbsp;id1_,<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />from&nbsp;T_USER&nbsp;tuser0_<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />left&nbsp;outer&nbsp;join<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />T_PASSPORT&nbsp;tpassport1_&nbsp;on&nbsp;tuser0_.id</span><span style="color: #000000">=</span><span style="color: #000000">tpassport1_.id<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />where&nbsp;tuser0_.id</span><span style="color: #000000">=?</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />User&nbsp;name</span><span style="color: #000000">=&gt;</span><span style="color: #000000">Carin<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Passport&nbsp;Serial</span><span style="color: #000000">=&gt;</span><span style="color: #000000">PCN759386</span></div>
Hibernate通过left outer join将T_User表及其关联的T_Passport表同时读入，因为此时将out-join=&#8220;true&#8221;。若设置为false，则会分开读取两个表。<br />
<br />
<strong>一对多关联</strong><br />
&nbsp;&nbsp;&nbsp; 用户TUser和地址TAddress的一对多关联。<br />
&nbsp;&nbsp;&nbsp; <strong>单向一对多关联<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主控方TUser的映射配置：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">hibernate-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="<img alt="" src="http://www.blogjava.net/Images/dot.gif" />TUser"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="t_user"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;dynamic-update</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;dynamic-insert</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" />.<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">set<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="address"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="t_address"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cascade</span><span style="color: #0000ff">="all"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order-by</span><span style="color: #0000ff">="zipcode&nbsp;asc"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">key&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="user_id"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">one-to-many&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="<img alt="" src="http://www.blogjava.net/Images/dot.gif" />TAddress"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">set</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">hibernate</span><span style="color: #0000ff">&gt;</span></div>
被动方TAddress的记录由Hibernate负责读取，之后存放在主控方TUser指定的Collection类型属性中。<br />
单向一对多的实现比较简单，但是存在一个问题，由于是单向关联，为了保持关联关系，我们只能通过主控方对被动方进行级联更新。如果被关联方的关联字段为&#8220;NOT NULL&#8221;，当Hibernate创建或者更新时，可能出现约束违例。<br />
<br />
<strong>双向多对一关联<br />
</strong>&nbsp;&nbsp;&nbsp; 实际上是&#8220;一对多&#8221;与&#8220;多对一&#8221;关联的组合。也就是说我们必须在主控方配置一对多关系的基础上，在被控方配置与其对应的多对一关联。<br />
&nbsp;&nbsp;&nbsp; TUser.hbm.xml<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">hibernate-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />TUser"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="t_user"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;dynamic-update</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;dynamic-insert</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">set<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="address"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="t_address"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lazy</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inverse</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cascade</span><span style="color: #0000ff">="all"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort</span><span style="color: #0000ff">="unsorted"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order-by</span><span style="color: #0000ff">="zipcode&nbsp;asc"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">key&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="user_id"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">one-to-many&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />TAddress"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">set</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">hibernate</span><span style="color: #0000ff">&gt;</span></div>
inverse="true"，TUser不在作为主控方，而是将关联关系的维护工作交给关联对象TAddress来做。<br />
在one-to-many关系中，将many一方设置为主控方（inverse=&#8220;true&#8221;）将有助于性能的改善。<br />
&nbsp;&nbsp;&nbsp; TAddress.hbm.xml<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">hibernat-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />TAddress"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="t_address"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;dynamic-update</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;dynamic-insert</span><span style="color: #0000ff">="false"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">many-to-one<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="user"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="TUser"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cascade</span><span style="color: #0000ff">="none"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outer-join</span><span style="color: #0000ff">="auto"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;access</span><span style="color: #0000ff">="property"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column</span><span style="color: #0000ff">="user_id"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not-null</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">hibernate-mapping</span><span style="color: #0000ff">&gt;</span></div>
<br />
<strong>多对多关联<br />
</strong>需要借助中间表来完成多对多映射信息的保存。<br />
&nbsp;&nbsp;&nbsp; 由于多对多关联的性能不佳（由于引入了中间表，一次读取操作需要反复多次查询），因此在设计中应该避免大量使用。同时，在多对多关系中，应根据情况，采取延迟加载机制来避免无谓的性能开销。<br />
&nbsp;&nbsp;&nbsp; TGroup与TRole的多对多关联：<br />
&nbsp;&nbsp;&nbsp; TGroup.hbm.xml：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">hibernate-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />TGroup"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="t_group"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;dynamic-update</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;dynamic-insert</span><span style="color: #0000ff">="false"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">set<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="roles"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="t_group_role"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lazy</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inverse</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cascade</span><span style="color: #0000ff">="save-update"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">key&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="group_id"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">many-to-many<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />TRole"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column</span><span style="color: #0000ff">="role_id"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">set</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">hibernate</span><span style="color: #0000ff">&gt;</span></div>
t_group_role为t_group与t_role之间的映射表，它保存了group和role之间的映射关系。<br />
cascade=&#8220;save-update&#8221;，对于多对多逻辑而言，很少出现删除一方需要级联删除所有关联数据的情况，如删除一个group，一般不会删除其中包含的Role。<br />
column=&#8220;group_id&#8221;映射表中对于t_group表记录的标识字段。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; TRole.hbm.xml：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">hibernate-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />TRole"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="t_role"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;dynamic-update</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;dynamic-insert</span><span style="color: #0000ff">="false"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">set<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="groups"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="t_group_role"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lazy</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inverse</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cascade</span><span style="color: #0000ff">="save-update"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort</span><span style="color: #0000ff">="unsorted"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">key&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="role_id"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">many-to-many&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />TGroup"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column</span><span style="color: #0000ff">="group_id"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outer-join</span><span style="color: #0000ff">="auto"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">set</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">hibernate</span><span style="color: #0000ff">&gt;</span></div>
多对多关系中，由于关联关系是两张表相互引用，因此在保存关联状态时必须对双方同时保存。<br />
<img src ="http://www.blogjava.net/Kira-2006/aggbug/199736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Kira-2006/" target="_blank">Kira-2006</a> 2008-05-10 20:08 <a href="http://www.blogjava.net/Kira-2006/articles/199736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出Hibernate笔记--1.2.1持久化设计与解耦</title><link>http://www.blogjava.net/Kira-2006/articles/197776.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Fri, 02 May 2008 11:33:00 GMT</pubDate><guid>http://www.blogjava.net/Kira-2006/articles/197776.html</guid><wfw:comment>http://www.blogjava.net/Kira-2006/comments/197776.html</wfw:comment><comments>http://www.blogjava.net/Kira-2006/articles/197776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kira-2006/comments/commentRss/197776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kira-2006/services/trackbacks/197776.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 解耦合的设计目标：&nbsp;&nbsp;&nbsp;&nbsp;1. 应用层解耦合--应用逻辑与数据逻辑相分离。&nbsp;&nbsp;&nbsp;&nbsp;2. 资源层解耦合--逻辑结构与物理结构相分离。DAO模式：即Data Accessor模式和Active Domain Object模式。&nbsp;&nbsp;&nbsp;&nbsp;Data Accessor模式...&nbsp;&nbsp;<a href='http://www.blogjava.net/Kira-2006/articles/197776.html'>阅读全文</a><img src ="http://www.blogjava.net/Kira-2006/aggbug/197776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Kira-2006/" target="_blank">Kira-2006</a> 2008-05-02 19:33 <a href="http://www.blogjava.net/Kira-2006/articles/197776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate生成器</title><link>http://www.blogjava.net/Kira-2006/articles/196287.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Sat, 26 Apr 2008 10:15:00 GMT</pubDate><guid>http://www.blogjava.net/Kira-2006/articles/196287.html</guid><wfw:comment>http://www.blogjava.net/Kira-2006/comments/196287.html</wfw:comment><comments>http://www.blogjava.net/Kira-2006/articles/196287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kira-2006/comments/commentRss/196287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kira-2006/services/trackbacks/196287.html</trackback:ping><description><![CDATA[<p>&lt;!--设置主键映射--&gt;<br />
&lt;id&nbsp; name="" &nbsp;column=""&nbsp; type=""&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;generator&nbsp; class=""&gt;&nbsp; 设置主键生成器<br />
&lt;/id&gt;<br />
Hibernate框架内建为主键提供了多种生成器，具体包括如下内容：<br />
1. increment：用于为long，short，int类型生成唯一标识。<br />
2. identity：对DB2，MySQL，MS SQL Server，Sybase和HypersonicSQL的内置标识字段提供支持。<br />
3. sequence：在DB2，PostgreSQL，Oracle，SAPDB，McKoi中使用序列（sequence），而在Interbase中使用生成器（generator）。<br />
4. hilo：使用一个高/低位算法高效生成long，short或int类型的标识符。给定一个表和字段（默认分别是hibernate_unique_key和next）作为高位值的来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。<br />
5. seqhilo：使用一个高/低位算法高效生成long，short或int类型的标识符，给定一个数据库序列（sequence）的名字。<br />
6. uuid.hex：用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中是唯一的（使用了IP地址）。UUID被编码位一个32位16进制数字的字符串。<br />
7. uuid.string：使用同样的UUID算法。UUID被编码位一个16个字符长的任意ASCII字符组成的字符串。<br />
8. native：根据底层数据库的能力选择identity、sequence、hilo中的一个。<br />
9. assigned：让应用程序在插表之前为对象分配一个标识符。<br />
10. foreign：使用另一个相关联的对象的标识符。通常被用在有关联关系的表中。<br />
<br />
<span style="color: red">一般来说，在Hibernate中，不推荐用assigned作为主键生成器。因为对数据库表来说，以业务逻辑字段作为主键有潜在的危险性。当该业务逻辑字段在将来需要改变的时候，作为主键的应用就会相当麻烦。常用的手段是用一个和业务无关的字段作为主键，而在PO中定义这个字段成为变量属性，同事又作为该对象的惟一标识。</span></p>
<img src ="http://www.blogjava.net/Kira-2006/aggbug/196287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Kira-2006/" target="_blank">Kira-2006</a> 2008-04-26 18:15 <a href="http://www.blogjava.net/Kira-2006/articles/196287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>