﻿<?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</title><link>http://www.blogjava.net/Kira-2006/</link><description>-仅仅是一阵风也罢了,偏偏是这样永恒,  仅仅是一场梦也罢了,偏偏是如此的真实,</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 09:07:16 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 09:07:16 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---SQL中datetime的映射</title><link>http://www.blogjava.net/Kira-2006/archive/2008/04/27/196459.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Sun, 27 Apr 2008 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/Kira-2006/archive/2008/04/27/196459.html</guid><wfw:comment>http://www.blogjava.net/Kira-2006/comments/196459.html</wfw:comment><comments>http://www.blogjava.net/Kira-2006/archive/2008/04/27/196459.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Kira-2006/comments/commentRss/196459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kira-2006/services/trackbacks/196459.html</trackback:ping><description><![CDATA[<p>在&nbsp;Hibernate学习中,通用的设置时间的映射如下:</p>
<p>&lt;property name="addtime" column="add_time" &nbsp;type="date" not-null="true"&gt;</p>
<p>如果按照上面的提示,则发现,生成的时间 只能精确到日,如 2007-08-08,而我们需要的是 2007-08-08 21:21:34</p>
<p>有人提示可以改成java.sql.Date类型,我没试过,因为在程序中用的多的是,java.util.Date</p>
<p>其实,通过简单的修改XML文件就可以得到2007-08-08 21:21:34</p>
<p>&lt;property name="addTime"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="add_time"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql-type="datetime" not-null="true"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p>这样修改,应该更可以被大家所接受</p>
<img src ="http://www.blogjava.net/Kira-2006/aggbug/196459.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-27 13:56 <a href="http://www.blogjava.net/Kira-2006/archive/2008/04/27/196459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>myeclipse自带Struts缺少jar文件，datasource配置</title><link>http://www.blogjava.net/Kira-2006/archive/2008/04/26/196313.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Sat, 26 Apr 2008 10:44:00 GMT</pubDate><guid>http://www.blogjava.net/Kira-2006/archive/2008/04/26/196313.html</guid><wfw:comment>http://www.blogjava.net/Kira-2006/comments/196313.html</wfw:comment><comments>http://www.blogjava.net/Kira-2006/archive/2008/04/26/196313.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Kira-2006/comments/commentRss/196313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kira-2006/services/trackbacks/196313.html</trackback:ping><description><![CDATA[<p>&nbsp;在应用过程中想使用DBCP数据源，遇到了一些问题,配置环境:Eclipse3.1,Myeclipse4.02</p>
<p>&nbsp;&nbsp; 在struts-config.xml的设计视图中可以选择"新增数据源"，Myeclipse会弹出向导窗口，这里使用的缺省DataSource的Type是"org.apache.struts.util.GenericDataSource"，而用DBCP数据源的话需要改为"org.apache.commons.dbcp.BasicDataSource"，当然了通过Myeclipse插入的Struts框架中是缺少DBCP的包的，好在Tomcat用的就是这个，因此能够在Tomcat\common\lib目录中找到需要的包：<br />
&nbsp;&nbsp; 1.commons-dbcp-1.2.1.jar<br />
&nbsp;&nbsp; 2.commons-pool-1.2.jar<br />
&nbsp;&nbsp; 在工程的配置路径中加入即可.也可以从apache的网站上 下载 </p>
<p>&nbsp;&nbsp; Myeclipse的向导窗口中具有一些属性栏，在这里可以输入数据源使用的Driver类名以及URL，当然还有用户名/密码。<br />
&nbsp;&nbsp; 属性栏全部都配置完毕后，会在struts-config.xml文件中加入&lt;data-sources&gt;标签，这里面的&lt;data-source&gt;即是刚刚新建的数据源配置参数，这里需要手工更改：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.增加&lt;data-source&gt;标签的type属性，这样 &lt;data-source type="org.apache.commons.dbcp.BasicDataSource"&gt;；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.属性名 driverClass 改为 dirverClassName；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.属性名 user 改为username，注意n是小写的；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.去掉属性标签 loginTimeout。</p>
<p>&nbsp;&nbsp; 改完以后就可以启动Tomcat看效果了 </p>
 <img src ="http://www.blogjava.net/Kira-2006/aggbug/196313.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:44 <a href="http://www.blogjava.net/Kira-2006/archive/2008/04/26/196313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转帖】61条面向对象设计的经验原则-《OOD启示录》ArthurJ.Riel</title><link>http://www.blogjava.net/Kira-2006/articles/196308.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Sat, 26 Apr 2008 10:40:00 GMT</pubDate><guid>http://www.blogjava.net/Kira-2006/articles/196308.html</guid><wfw:comment>http://www.blogjava.net/Kira-2006/comments/196308.html</wfw:comment><comments>http://www.blogjava.net/Kira-2006/articles/196308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kira-2006/comments/commentRss/196308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kira-2006/services/trackbacks/196308.html</trackback:ping><description><![CDATA[<table class="Title" cellspacing="0" cellpadding="0" align="center" border="0">
    <tbody>
        <tr>
            <td>61条面向对象设计的经验原则</td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
<table class="Text" cellspacing="0" cellpadding="0" align="center" border="0">
    <tbody>
        <tr>
            <td>(1)<strong>所有数据都应该隐藏在所在的类的内部。p13</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(2)<strong>类的使用者必须依赖类的共有接口，但类不能依赖它的使用者。p15</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(3)<strong>尽量减少类的<a href="http://net.rdxx.com/Knowledge/Protocol/" target="_blank">协议</a>中的消息。p16</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(4)<strong>实现所有类都理解的最基本公有接口[例如，拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。 p16</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(5)<strong>不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。p17</strong></td>
        </tr>
        <tr>
            <td>如果类的两个方法有一段公共代码，那么就可以创建一个防止这些公共代码的私有函数。</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(6)<strong>不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。p17</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(7)<strong>类之间应该零耦合，或者只有导出耦合关系。也即，一个类要么同另一个类毫无关系，要么只使用另一个类的公有接口中的操作。 p18</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(8)<strong>类应该只表示一个关键抽象。p19</strong></td>
        </tr>
        <tr>
            <td>包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响，则将对包中的所有类产生影响，而对其他的包不造成任何影响 .</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(9)<strong>把相关的数据和行为集中放置。p19</strong></td>
        </tr>
        <tr>
            <td>设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(10)<strong>把不相关的信息放在另一个类中(也即：互不沟通的行为)。p19 </strong></td>
        </tr>
        <tr>
            <td>朝着稳定的方向进行依赖.</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(11)<strong>确保你为之建模的抽象概念是类，而不只是对象扮演的角色。p23</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(12)<strong>在水平方向上尽可能统一地分布系统功能，也即：按照设计，顶层类应当统一地共享工作。p30</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(13)<strong>在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。p30</strong></td>
        </tr>
        <tr>
            <td>规划一个接口而不是实现一个接口。</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(14)<strong>对公共接口中定义了大量访问方法的类多加小心。大量访问方法意味着相关数据和行为没有集中存放。p30</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(15)<strong>对包含太多互不沟通的行为的类多加小心。p31</strong></td>
        </tr>
        <tr>
            <td>这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(16)<strong>在由同用户界面交互的面向对象模型构成的应用程序中，模型不应该依赖于界面，界面则应当依赖于模型。p33</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(17)<strong>尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则) 。p36</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(18)<strong>从你的设计中去除不需要的类。p38</strong></td>
        </tr>
        <tr>
            <td>一般来说，我们会把这个类降级成一个属性。</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(19)<strong>去除系统外的类。p39</strong></td>
        </tr>
        <tr>
            <td>系统外的类的特点是，抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。 </td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(20)<strong>不要把操作变成类。质疑任何名字是动词或者派生自动词的类，特别是只有一个有意义行为的类。考虑一下那个有意义的行为是否应当迁移到已经存在或者尚未发现的某个类中。p40</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(21)<strong>我们在创建应用程序的分析模型时常常引入代理类。在设计阶段，我们常会发现很多代理没有用的，应当去除。p43</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(22)<strong>尽量减少类的协作者的数量。p52</strong></td>
        </tr>
        <tr>
            <td>一个类用到的其他类的数目应当尽量少。 </td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(23)<strong>尽量减少类和协作者之间传递的消息的数量。p55</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(24)<strong>尽量减少类和协作者之间的协作量，也即：减少类和协作者之间传递的不同消息的数量。p55</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(25)<strong>尽量减少类的扇出，也即：减少类定义的消息数和发送的消息数的乘积。p55</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(26)<strong>如果类包含另一个类的对象，那么包含类应当给被包含的对象发送消息。也即：包含关系总是意味着使用关系。p55</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(27)<strong>类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。p57</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(28)<strong>类包含的对象数目不应当超过开发者短期记忆的容量。这个数目常常是6。p57</strong></td>
        </tr>
        <tr>
            <td>当类包含多于6个数据成员时，可以把逻辑相关的数据成员划分为一组，然后用一个新的包含类去包含这一组成员。 </td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(29)<strong>让系统功能在窄而深的继承体系中垂直分布。p58</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(30)<strong>在实现语义约束时，最好根据类定义来实现。这常常会导致类泛滥成灾，在这种情况下，约束应当在类的行为中实现，通常是在构造函数中实现，但不是必须如此。p60</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(31)<strong>在类的构造函数中实现语义约束时，把约束测试放在构造函数领域所允许的尽量深的包含层次中。p60</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(32)<strong>约束所依赖的语义信息如果经常改变，那么最好放在一个集中式的第3方对象中。p60</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(33)<strong>约束所依赖的语义信息如果很少改变，那么最好分布在约束所涉及的各个类中。p60 </strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(34)<strong>类必须知道它包含什么，但是不能知道谁包含它。p61</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(35)<strong>共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。p61</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(36)<strong>继承只应被用来为特化层次结构建模。p74</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(37)<strong>派生类必须知道基类，基类不应该知道关于它们的派生类的任何信息。p74</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(38)<strong>基类中的所有数据都应当是私有的，不要使用保护数据。p75</strong></td>
        </tr>
        <tr>
            <td>类的设计者永远都不应该把类的使用者不需要的东西放在公有接口中。 </td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(39)<strong>在理论上，继承层次体系应当深一点，越深越好。p77</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(40)<strong>在实践中，继承层次体系的深度不应当超出一个普通人的短期记忆能力。一个广为接受的深度值是6。p77</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(41)<strong>所有的抽象类都应当是基类。p81</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(42)<strong>所有的基类都应当是抽象类。p82</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(43)<strong>把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端。p85 </strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(44)<strong>如果两个或更多个类共享公共数据(但没有公共行为)，那么应当把公共数据放在一个类中，每个共享这个数据的类都包含这个类。 p88</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(45)<strong>如果两个或更多个类有共同的数据和行为(就是方法)，那么这些类的每一个都应当从一个表示了这些数据和方法的公共基类继承。 p89</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(46)<strong>如果两个或更多个类共享公共接口(指的是消息，而不是方法)，那么只有他们需要被多态地使用时，他们才应当从一个公共基类继承。 p89</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(47)<strong>对对象类型的显示的分情况分析一般是错误的。在大多数这样的情况下，设计者应当使用多态。p89</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(48)<strong>对属性值的显示的分情况分析常常是错误的。类应当解耦合成一个继承层次结构，每个属性值都被变换成一个派生类。 p96</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(49)<strong>不要通过继承关系来为类的动态语义建模。试图用静态语义关系来为动态语义建模会导致在运行时切换类型。p97 </strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(50)<strong>不要把类的对象变成派生类。对任何只有一个实例的派生类都要多加小心。p99</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(51)<strong>如果你觉得需要在运行时刻创建新的类，那么退后一步以认清你要创建的是对象。现在，把这些对象概括成一个类。 p103</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(52)<strong>在派生类中用空方法(也就是什么也不做的方法)来覆写基类中的方法应当是非法的。p103</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(53)<strong>不要把可选包含同对继承的需要相混淆。把可选包含建模成继承会带来泛滥成灾的类。p108</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(54)<strong>在创建继承层次时，试着创建可复用的框架，而不是可复用的组件。p112</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(55)<strong>如果你在设计中使用了多重继承，先假设你犯了错误。如果没犯错误，你需要设法证明。p120</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(56)<strong>只要在面向对象设计中用到了继承，问自己两个问题：(1)派生类是否是它继承的那个东西的一个特殊类型？(2)基类是不是派生类的一部分？p121</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(57)<strong>如果你在一个面向对象设计中发现了多重继承关系，确保没有哪个基类实际上是另一个基类的派生类。p122</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(58)<strong>在面向对象设计中如果你需要在包含关系和关联关系间作出选择，请选择包含关系。p123</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(59)<strong>不要把全局数据或全局函数用于类的对象的薄记工作。应当使用类变量或类方法。p140</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(60)<strong>面向对象设计者不应当让物理设计准则来破坏他们的逻辑设计。但是，在对逻辑设计作出决策的过程中我们经常用到物理设计准则。 p149</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>(61)<strong>不要绕开公共接口去修改对象的状态。p164</strong></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/Kira-2006/aggbug/196308.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:40 <a href="http://www.blogjava.net/Kira-2006/articles/196308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant操作hsql数据库</title><link>http://www.blogjava.net/Kira-2006/articles/196291.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Sat, 26 Apr 2008 10:25:00 GMT</pubDate><guid>http://www.blogjava.net/Kira-2006/articles/196291.html</guid><wfw:comment>http://www.blogjava.net/Kira-2006/comments/196291.html</wfw:comment><comments>http://www.blogjava.net/Kira-2006/articles/196291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kira-2006/comments/commentRss/196291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kira-2006/services/trackbacks/196291.html</trackback:ping><description><![CDATA[<p>使用Ant操作hsql数据库的例子：<br />
<br />
&lt;?xml version="1.0"?&gt;</p>
<p>&lt;project name="timexdb"&gt;<br />
&nbsp;&lt;property name="hjar" value="WebRoot/WEB-INF/lib/hsqldb.jar" /&gt;<br />
&nbsp;&lt;property name="hclass" value="org.hsqldb.Server" /&gt;<br />
&nbsp;&lt;property name="hfile" value="-database.0 data/gogoudb" /&gt;<br />
&nbsp;&lt;property name="halias" value="gogou" /&gt;<br />
&nbsp;&lt;property name="hport" value="9005" /&gt;</p>
<p>&nbsp;&lt;target name="starthsql"&gt;<br />
&nbsp;&nbsp;&lt;java fork="true" <br />
&nbsp;&nbsp;&nbsp;classname="${hclass}" <br />
&nbsp;&nbsp;&nbsp;classpath="${hjar}" <br />
&nbsp;&nbsp;&nbsp;args="${hfile} -dbname.0 ${halias} -port ${hport}" /&gt;<br />
&nbsp;&lt;/target&gt;</p>
<p>&nbsp;&lt;target name="execddl"&gt;<br />
&nbsp;&nbsp;&lt;sql classpath="${hjar}" <br />
&nbsp;&nbsp;&nbsp;driver="org.hsqldb.jdbcDriver" <br />
&nbsp;&nbsp;&nbsp;url="jdbc:hsqldb:hsql://localhost:${hport}/${halias}" <br />
&nbsp;&nbsp;&nbsp;userid="sa" <br />
&nbsp;&nbsp;&nbsp;password="" <br />
&nbsp;&nbsp;&nbsp;print="yes"&gt;<br />
<br />
-- SQL script for TimeX<br />
-- Step 1: Drop objects if they exist<br />
DROP TABLE Department IF EXISTS;<br />
DROP TABLE Employee IF EXISTS;<br />
DROP TABLE Timesheet IF EXISTS;<br />
DROP INDEX TimesheetIndex IF EXISTS;<br />
DROP INDEX DepartmentCodeIndex IF EXISTS;<br />
DROP INDEX EmployeeIdIndex IF EXISTS;<br />
DROP TABLE customer IF EXISTS;<br />
DROP TABLE Item IF EXISTS;<br />
DROP TABLE Item_subType IF EXISTS;<br />
DROP TABLE Item_superType IF EXISTS;<br />
DROP TABLE orders IF EXISTS;<br />
&nbsp;&nbsp;&nbsp;<br />
-- Step 2: Create tables<br />
CREATE TABLE Item_superType<br />
(<br />
&nbsp;&nbsp; superID BIGINT primary key,<br />
&nbsp;&nbsp; superTypeName VARCHAR(20) NOT NULL<br />
);</p>
<p>CREATE TABLE Item_subType<br />
(<br />
&nbsp;&nbsp; subID BIGINT primary key,<br />
&nbsp;&nbsp; superID BIGINT,<br />
&nbsp;&nbsp; subTypeName VARCHAR(20) NOT NULL,<br />
&nbsp;&nbsp; FOREIGN KEY(superID) REFERENCES Item_superType(superID) <br />
);</p>
<p>CREATE TABLE Item<br />
(<br />
&nbsp;&nbsp; itemID BIGINT primary key,<br />
&nbsp;&nbsp; subID BIGINT,<br />
&nbsp;&nbsp; itemName VARCHAR(20) NOT NULL,<br />
&nbsp;&nbsp; Introduce VARCHAR(50) ,<br />
&nbsp;&nbsp; Price VARCHAR(6) NOT NULL,<br />
&nbsp;&nbsp; nowPrice VARCHAR(6) NOT NULL,<br />
&nbsp;&nbsp; smallPicture VARCHAR(10) NOT NULL,<br />
&nbsp;&nbsp; bigPicture VARCHAR(10) NOT NULL,<br />
&nbsp;&nbsp; inTime datetime ,<br />
&nbsp;&nbsp; newItem INT ,<br />
&nbsp;&nbsp; Rebate INT ,<br />
&nbsp;&nbsp; Hit INT ,<br />
&nbsp;&nbsp; FOREIGN KEY(subID) REFERENCES Item_subType(subID)<br />
);</p>
<p>CREATE TABLE customer<br />
(<br />
&nbsp;&nbsp;&nbsp; userID BIGINT IDENTITY,<br />
&nbsp;&nbsp;&nbsp; username VARCHAR(20) NOT NULL,<br />
&nbsp;&nbsp;&nbsp; Password&nbsp; VARCHAR(20) NOT NULL,<br />
&nbsp;&nbsp;&nbsp; userCity&nbsp; VARCHAR(20) ,<br />
&nbsp;&nbsp;&nbsp; userEmail&nbsp; VARCHAR(20) NOT NULL,<br />
&nbsp;&nbsp;&nbsp; userAge&nbsp; INT ,<br />
&nbsp;&nbsp;&nbsp; userSex&nbsp; INT<br />
&nbsp;);<br />
&nbsp;&nbsp;&nbsp; &nbsp;<br />
CREATE TABLE orders<br />
(<br />
&nbsp;orderID BIGINT IDENTITY,<br />
&nbsp;&nbsp;&nbsp; consigneeName VARCHAR(20) NOT NULL,<br />
&nbsp;&nbsp;&nbsp; consigneeAddress VARCHAR(20) NOT NULL,<br />
&nbsp;&nbsp;&nbsp; Postalcode VARCHAR(6) NOT NULL,<br />
&nbsp;&nbsp;&nbsp; Telephone VARCHAR(20) NOT NULL,<br />
&nbsp;&nbsp;&nbsp; carryMethod VARCHAR(10) NOT NULL,<br />
&nbsp;&nbsp;&nbsp; Orderdate&nbsp; datetime&nbsp;&nbsp; <br />
);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
CREATE TABLE visualOrder<br />
(<br />
&nbsp;&nbsp;&nbsp;&nbsp; id BIGINT&nbsp; IDENTITY, <br />
&nbsp;&nbsp;&nbsp;&nbsp; itemID BIGINT,<br />
&nbsp;&nbsp;&nbsp;&nbsp; userID BIGINT,<br />
&nbsp;&nbsp;&nbsp;&nbsp; orderID BIGINT,<br />
&nbsp;&nbsp;&nbsp;&nbsp; itemNumber BIGINT NOT NULL,<br />
&nbsp;&nbsp;&nbsp;&nbsp; FOREIGN KEY(itemID) REFERENCES Item(itemID),<br />
&nbsp;&nbsp;&nbsp;&nbsp; FOREIGN KEY(userID) REFERENCES customer(userID),<br />
&nbsp;&nbsp;&nbsp;&nbsp; FOREIGN KEY(orderID) REFERENCES orders(orderID)<br />
);<br />
<br />
-- Step 3: Create indexes<br />
CREATE UNIQUE INDEX visualOrderIndex ON visualOrder (userID);<br />
CREATE UNIQUE INDEX ItemIndex ON Item (itemID);<br />
CREATE UNIQUE INDEX userIdIndex ON customer (userId);<br />
&nbsp;&nbsp;&nbsp;<br />
create view newItem_statistic as&nbsp; select * from item where item.newItem = 1;<br />
create view saleItem_statistic as&nbsp; select * from item where item.Rebate = 1;</p>
<p>-- Step 4: Insert some reference and test data<br />
INSERT INTO customer (userName, Password,userEmail) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES ('kira', 'kira','xuguoliang@sina.com');</p>
<p><br />
-- Step 5: Verify tables and test data look ok<br />
SELECT * FROM customer;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/sql&gt;<br />
&nbsp;&lt;/target&gt;<br />
&nbsp;&lt;target name="hsqldm"&gt;<br />
&nbsp;&nbsp;&lt;java fork="true" classpath="${hjar}" classname="org.hsqldb.util.DatabaseManagerSwing" /&gt;<br />
&nbsp;&lt;/target&gt;<br />
&nbsp;&lt;target name="sqltool"&gt;<br />
&nbsp;&nbsp;&lt;java fork="true" classpath="${hjar}" classname="org.hsqldb.util.SqlTool" args="localhost-sa" /&gt;<br />
&nbsp;&lt;/target&gt;<br />
&lt;/project&gt;</p>
<img src ="http://www.blogjava.net/Kira-2006/aggbug/196291.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:25 <a href="http://www.blogjava.net/Kira-2006/articles/196291.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><item><title>hsqldb编写批处理文件启动自己创建的数据库</title><link>http://www.blogjava.net/Kira-2006/articles/190208.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Tue, 01 Apr 2008 13:54:00 GMT</pubDate><guid>http://www.blogjava.net/Kira-2006/articles/190208.html</guid><wfw:comment>http://www.blogjava.net/Kira-2006/comments/190208.html</wfw:comment><comments>http://www.blogjava.net/Kira-2006/articles/190208.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Kira-2006/comments/commentRss/190208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kira-2006/services/trackbacks/190208.html</trackback:ping><description><![CDATA[<span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;hsql</span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">数据库是一款纯<span lang="EN-US">Java</span>编写的免费数据库，许可是<span lang="EN-US">BSD-style</span>的协议，如果你是使用<span lang="EN-US">Java</span>编程的话，不凡考虑一下使用它，相对其他数据库来说，其体积小，我使用的是hsqldb1_8_0_7,压缩包大小为3.12M。仅一个<span lang="EN-US">hsqldb.jar</span>文件就包括了数据库引擎，数据库驱动，还有其他用户界面操作等内容。<br />
&nbsp;&nbsp;&nbsp;&nbsp;看了一下网上的一些hsqldb的资料，大多数数据库的启动和用户界面的操作都在命令行中进行操作，o(&#8745;_&#8745;)o...哈哈，感觉有点麻烦。在hsqldb的压缩包中，有个自带的数据库test，它的启动和用户界面操作都是直接有一个批处理文件来执行，很方便。其实我们就可以根据这两个批处理文件来写自己创建的数据库的批处理文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;hsqldb自带数据库的启动批处理文件，在压缩包中，demo/runServer.bat文件，右键&#8220;编辑&#8221;，可以看到文件中的内容为：<br />
<font face="宋体">cd ..\data<br />
@java -classpath ../lib/hsqldb.jar org.hsqldb.Server %1 %2 %3 %4 %5 %6 %7 %8 %9<br />
</font>即启动在data目录下的系统自带的数据库test。<br />
如果你要在db目录下创建，并启动数据库mydb。就可以编写批处理文件：<br />
cd ..\db<br />
@java -classpath ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 mydb<br />
用户界面的操作可以同样的方式进行编写批处理文件。</span> 
  <img src ="http://www.blogjava.net/Kira-2006/aggbug/190208.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-01 21:54 <a href="http://www.blogjava.net/Kira-2006/articles/190208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>