﻿<?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-BaoYaEr-文章分类-Hibernate</title><link>http://www.blogjava.net/baoyaer/category/18013.html</link><description>java</description><language>zh-cn</language><lastBuildDate>Fri, 30 May 2008 07:51:23 GMT</lastBuildDate><pubDate>Fri, 30 May 2008 07:51:23 GMT</pubDate><ttl>60</ttl><item><title>spring+hibernate的clob大字段处理（转载于javaeye论坛） </title><link>http://www.blogjava.net/baoyaer/articles/204004.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 30 May 2008 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/204004.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/204004.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/204004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/204004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/204004.html</trackback:ping><description><![CDATA[<span class="genmed">
<p>spring+hibernate的clob大字段处理（转载于javaeye论坛） </p>
<p>在spring中如何处理oracle大字段 </p>
<p>在spring中采用OracleLobHandler来处理oracle大字段（包括clob和blob），则在程序中不需要引用oracle的特殊类，从而能够保证支持我们的代码支持多数据库。 </p>
<p>1、首先数据表中的clob类型对应java持久化类的String类型；而blob类型对应byte[]类型 <br />
2、定义hibernate标签时，持久化类中对应clob类型的属性的hibernate type应为org.springframework.orm.hibernate.support.ClobStringType；而对应blob类型的属性的hibernate type应为org.springframework.orm.hibernate.support.BlobByteArrayType。 <br />
3、以后访问这些对应clob和blob类型的属性时，按普通属性处理，不需要特别编码。 </p>
<p>java代码:&nbsp;&nbsp; <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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;bean&nbsp;&nbsp;</span><span style="color: #ff0000">id&nbsp;</span><span style="color: #0000ff">="mySessionFactory2"</span><span style="color: #ff0000">&nbsp;&nbsp;class&nbsp;</span><span style="color: #0000ff">="org.springframework.orm.hibernate.LocalSessionFactoryBean"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;property&nbsp;&nbsp;</span><span style="color: #ff0000">name&nbsp;</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="myDataSource2"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;property&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;property&nbsp;&nbsp;</span><span style="color: #ff0000">name&nbsp;</span><span style="color: #0000ff">="lobHandler"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="oracleLobHandle"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;property&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;bean&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;bean&nbsp;&nbsp;</span><span style="color: #ff0000">id&nbsp;</span><span style="color: #0000ff">="nativeJdbcExtractor"</span><span style="color: #ff0000">&nbsp;&nbsp;class&nbsp;</span><span style="color: #0000ff">="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;bean&nbsp;&nbsp;</span><span style="color: #ff0000">id&nbsp;</span><span style="color: #0000ff">="oracleLobHandle"</span><span style="color: #ff0000">&nbsp;&nbsp;class&nbsp;</span><span style="color: #0000ff">="org.springframework.jdbc.support.lob.OracleLobHandler"</span><span style="color: #ff0000">&nbsp;&nbsp;Lazy-init&nbsp;</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;property&nbsp;&nbsp;</span><span style="color: #ff0000">name&nbsp;</span><span style="color: #0000ff">="nativeJdbcExtractor"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">local&nbsp;</span><span style="color: #0000ff">="nativejdbcExtractor"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;property&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;bean&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<br />
Spring为处理数据库Lob字段，特别提供了LobHandler接口。在操作Oracle RDBMS过程中，由于Oracle JDBC Driver实现的问题，应用必须采用Oracle原生的数据库连接（比如，oracle.jdbc.OracleConnection）、LOB原生实现（比如，oracle.sql.BLOB、oracle.sql.CLOB）。因此，LobHandler接口存在上述两种实现。简而言之，为操作Oracle数据库，必须使用OracleLobHandler实现。如果操作其他RDBMS类型，则使用DefaultLobHandler。NativeJdbcExtractor是个接口，通过它能够抽象各种连接池。另外Spring还提供两个接口存取Blob，LobCreator及LobHandler <br />
<br />
hbm文件配置<br />
<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="content"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="C_Content"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="org.springframework.orm.hibernate3.support.ClobStringType"</span><span style="color: #ff0000"> <br />
length</span><span style="color: #0000ff">="10000"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
<p><font face="Arial" size="2">&nbsp;JavaBean的对应的属性类型为String。</font> <br />
<br />
需要注意两点：(1)如果使用Oracle9i自带的class12.jar这个JDBC驱动的话是不行的，会报错，据说要升级到classes12-9i.jar，我在Oracle的网站上没找到对应的下载，下载了ojdbc14.jar就可以了。(2)对Clob或Blog的操作必须在一个事务中进行，如在Dao层测试会出错，在配置了事务的Logic层就没问题了。 </p>
<p><font face="Arial"><font size="2">经过测试,如果用Oracle10g的JDBC驱动就没这么麻烦了，Hibernate+Oracle+CLOB的读写其实只要这样做：</font> </font></p>
<p><font face="Arial" size="2">1.在Oracle里设置某字段为clob类型。<br />
2.在Hibernate的配置文件里使用网上下载的Oracle 10g最新的jdbc驱动。<br />
3.实体类里把clob字段对应的属性类型设置为String。<br />
4.hibernate的映射文件*.hbm.xml里把该字段对应的类型该为text。</font> </p>
<p><font face="Arial" size="2">然后就可以在程序里把它当成String随便用了。</font> </p>
<p><font face="Arial" size="2">补充：按照上面的方法又写了一个测试类，能够操作Clob字段了，但是启动JBOSS后就不能用了，后来找了很久才发现，原来我用的JBOSS的default/lib目录下也有一下老版本的Class12.jar，删除它换成最新的ojdbc14.jar就可以了。<br />
</font></p>
<br />
</span>
<img src ="http://www.blogjava.net/baoyaer/aggbug/204004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-30 09:30 <a href="http://www.blogjava.net/baoyaer/articles/204004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 乐观锁与悲观锁使用</title><link>http://www.blogjava.net/baoyaer/articles/203445.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 28 May 2008 03:56:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/203445.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/203445.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/203445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/203445.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/203445.html</trackback:ping><description><![CDATA[Hibernate支持两种锁机制： <br />
即通常所说的&#8220;悲观锁（Pessimistic Locking）&#8221;和 &#8220;乐观锁（OptimisticLocking）&#8221;。 <br />
<br />
悲观锁的实现，往往依靠数据库提供的锁机制（也只有数据库层提供的锁机制才能真正保证数据访问的排他性，否则，即使在本系统中实现了加锁机制，也无法保证外部系统不会修改数据）。 <br />
<br />
Hibernate的加锁模式有： <br />
&#216; LockMode.NONE ： 无锁机制。 <br />
&#216; LockMode.WRITE ：Hibernate在Insert和Update记录的时候会自动 <br />
获取。 <br />
&#216; LockMode.READ ： Hibernate在读取记录的时候会自动获取。 <br />
以上这三种锁机制一般由Hibernate内部使用，如Hibernate为了保证Update <br />
过程中对象不会被外界修改，会在save方法实现中自动为目标对象加上WRITE锁。 <br />
&#216; LockMode.UPGRADE ：利用数据库的for update子句加锁。 <br />
&#216; LockMode. UPGRADE_NOWAIT ：Oracle的特定实现，利用Oracle的for update nowait子句实现加锁。&nbsp;<br />
<br />
&nbsp;Hibernate的悲观锁，也是基于数据库的锁机制实现。 下面的代码实现了对查询记录的加锁：
<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"><span style="color: #008080">1</span> <img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> <span style="color: #000000">String&nbsp;hqlStr&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;</span> <span style="color: #000000">"</span> <span style="color: #000000">from&nbsp;TUser&nbsp;as&nbsp;user&nbsp;where&nbsp;user.name=&#8217;Erica&#8217;</span> <span style="color: #000000">"</span> <span style="color: #000000">;&nbsp;<br />
</span><span style="color: #008080">2</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Query&nbsp;query&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;session.createQuery(hqlStr);&nbsp;<br />
</span><span style="color: #008080">3</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />query.setLockMode(</span> <span style="color: #000000">"</span> <span style="color: #000000">user</span> <span style="color: #000000">"</span> <span style="color: #000000">,LockMode.UPGRADE);&nbsp;</span> <span style="color: #008000">//</span> <span style="color: #008000">加锁&nbsp;</span> <span style="color: #008000"><br />
</span><span style="color: #008080">4</span> <span style="color: #008000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">List&nbsp;userList&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;query.list();</span> <span style="color: #008000">//</span> <span style="color: #008000">执行查询，</span> </div>
<p>获取数据 <u>query.setLockMode</u> 对查询语句中特定别名所对应的记录进行加锁（我们为 TUser类指定了一个别名&#8220;user&#8221;），这里也就是对返回的所有user记录进行加锁。 观察运行期Hibernate生成的SQL语句：&nbsp;<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"><span style="color: #008080">1</span> <img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> <span style="color: #000000">select&nbsp;tuser0_.id&nbsp;as&nbsp;id,&nbsp;tuser0_.name&nbsp;as&nbsp;name,&nbsp;tuser0_.group_id&nbsp;as&nbsp;group_id,&nbsp;tuser0_.user_type&nbsp;as&nbsp;user_type,&nbsp;tuser0_.sex&nbsp;as&nbsp;sex&nbsp;from&nbsp;t_user&nbsp;tuser0_&nbsp;where&nbsp;(tuser0_.name</span> <span style="color: #000000">=</span> <span style="color: #000000">&#8217;Erica&#8217;&nbsp;)&nbsp;</span> <span style="color: #0000ff">for</span> <span style="color: #000000">&nbsp;update</span> </div>
<p>&nbsp;这里Hibernate通过使用数据库的for update子句实现了<font color="#0000ff"><strong>悲观锁</strong></font>机制。 <br />
<br />
上面这两种锁机制是我们在应用层较为常用的，加锁一般通过以下方法实现： <br />
Criteria.setLockMode <br />
Query.setLockMode <br />
Session.lock <br />
<span style="color: red">注意，只有在查询开始之前（也就是Hiberate 生成SQL 之前）设定加锁，才会 真正通过数据库的锁机制进行加锁处理，否则，数据已经通过不包含for update 子句的Select SQL加载进来，所谓数据库加锁也就无从谈起。</span> </p>
<br />
<br />
<br />
<br />
<br />
乐观锁，大多是基于数据版本（Version）记录机制实现。何谓数据版本？即为数据增加一个版本标识，在基于数据库表的版本解决方案中，一般是通过为数据库表增加一个&#8220;version&#8221;字段来实现。读取出数据时，将此版本号一同读出，之后更新时，对此版本号加一。此时，将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对，如果提交的数据版本号大于数据库表当前版本号，则予以更新，否则认为是过期数据。 <br />
<br />
1． 首先为TUser的class描述符添加optimistic-lock属性：
<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">&lt;</span> <span style="color: #000000">hibernate</span> <span style="color: #000000">-</span> <span style="color: #000000">mapping</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span> <span style="color: #000000">&lt;</span> <span style="color: #0000ff">class</span> <span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />name</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">org.hibernate.sample.TUser</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />table</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">t_user</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />dynamic</span> <span style="color: #000000">-</span> <span style="color: #000000">update</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">true</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />dynamic</span> <span style="color: #000000">-</span> <span style="color: #000000">insert</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">true</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />optimistic</span> <span style="color: #000000">-</span> <span style="color: #000000">lock</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">version</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span> <span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&#8230;&#8230;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span> <span style="color: #000000">&lt;/</span> <span style="color: #0000ff">class</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span> <span style="color: #000000">&lt;/</span> <span style="color: #000000">hibernate</span> <span style="color: #000000">-</span> <span style="color: #000000">mapping</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;</span> </div>
<p>&nbsp;</p>
&nbsp;添加一个Version属性描述符 <br />
代码内容<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"><span style="color: #008080">&nbsp;1</span> <img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> <span style="color: #000000">&lt;</span> <span style="color: #000000">hibernate</span> <span style="color: #000000">-</span> <span style="color: #000000">mapping</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;2</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">&lt;</span> <span style="color: #0000ff">class</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;3</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />name</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">org.hibernate.sample.TUser</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;4</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />table</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">t_user</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;5</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />dynamic</span> <span style="color: #000000">-</span> <span style="color: #000000">update</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">true</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />dynamic</span> <span style="color: #000000">-</span> <span style="color: #000000">insert</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">true</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;7</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />optimistic</span> <span style="color: #000000">-</span> <span style="color: #000000">lock</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">version</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">&lt;</span> <span style="color: #000000">id&nbsp;&nbsp;<br />
</span><span style="color: #008080">10</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />name</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">id</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">11</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />column</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">id</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">12</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />type</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">java.lang.Integer</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">13</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">14</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">&lt;</span> <span style="color: #000000">generator&nbsp;</span> <span style="color: #0000ff">class</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">native</span> <span style="color: #000000">"</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">15</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">&lt;/</span> <span style="color: #000000">generator</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">16</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">&lt;/</span> <span style="color: #000000">id</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">17</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">&lt;</span> <span style="color: #000000">version&nbsp;&nbsp;<br />
</span><span style="color: #008080">18</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />column</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">version</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">19</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />name</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">version</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">20</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />type</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">java.lang.Integer</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">21</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">/&gt;</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">22</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&#8230;&#8230;&nbsp;&nbsp;<br />
</span><span style="color: #008080">23</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">&lt;/</span> <span style="color: #0000ff">class</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">24</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">&lt;/</span> <span style="color: #000000">hibernate</span> <span style="color: #000000">-</span> <span style="color: #000000">mapping</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">25</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span></div>
<p><br />
&nbsp;</p>
<br />
<p>注意version 节点必须出现在ID 节点之后。<br />
&nbsp;这里我们声明了一个version属性，用于存放用户的版本信息，保存在TUser表的 version字段中。 此时如果我们尝试编写一段代码，更新TUser表中记录数据，如： <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"><span style="color: #008080">1</span> <img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> <span style="color: #000000">Criteria&nbsp;criteria&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;session.createCriteria(TUser.</span> <span style="color: #0000ff">class</span> <span style="color: #000000">);&nbsp;&nbsp;<br />
</span><span style="color: #008080">2</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />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">));&nbsp;&nbsp;<br />
</span><span style="color: #008080">3</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />List&nbsp;userList&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;criteria.list();&nbsp;&nbsp;<br />
</span><span style="color: #008080">4</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />TUser&nbsp;user&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">(TUser)userList.get(</span> <span style="color: #000000">0</span> <span style="color: #000000">);&nbsp;&nbsp;<br />
</span><span style="color: #008080">5</span> <span style="color: #000000"><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;session.beginTransaction();&nbsp;&nbsp;<br />
</span><span style="color: #008080">6</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />user.setUserType(</span> <span style="color: #000000">1</span> <span style="color: #000000">);&nbsp;</span> <span style="color: #008000">//</span> <span style="color: #008000">更新UserType字段&nbsp;&nbsp;</span> <span style="color: #008000"><br />
</span><span style="color: #008080">7</span> <span style="color: #008000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #000000">tx.commit();&nbsp;&nbsp;<br />
</span><span style="color: #008080">8</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span></div>
<br />
<p>每次对TUser进行更新的时候，我们可以发现，数据库中的version都在递增。 而如果我们尝试在tx.commit 之前，启动另外一个Session，对名为Erica 的用 户进行操作，以模拟并发更新时的情形： <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"><span style="color: #008080">&nbsp;1</span> <img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> <span style="color: #000000">Session&nbsp;session</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;getSession();&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;2</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Criteria&nbsp;criteria&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;session.createCriteria(TUser.</span> <span style="color: #0000ff">class</span> <span style="color: #000000">);&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;3</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />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">));&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;4</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Session&nbsp;session2&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;getSession();&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;5</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Criteria&nbsp;criteria2&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;session2.createCriteria(TUser.</span> <span style="color: #0000ff">class</span> <span style="color: #000000">);&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />criteria2.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">));&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;7</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />List&nbsp;userList&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;criteria.list();&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />List&nbsp;userList2&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;criteria2.list();TUser&nbsp;user&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">(TUser)userList.get(</span> <span style="color: #000000">0</span> <span style="color: #000000">);&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />TUser&nbsp;user2&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">(TUser)userList2.get(</span> <span style="color: #000000">0</span> <span style="color: #000000">);&nbsp;&nbsp;<br />
</span><span style="color: #008080">10</span> <span style="color: #000000"><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;session.beginTransaction();&nbsp;&nbsp;<br />
</span><span style="color: #008080">11</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Transaction&nbsp;tx2&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;session2.beginTransaction();&nbsp;&nbsp;<br />
</span><span style="color: #008080">12</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />user2.setUserType(</span> <span style="color: #000000">99</span> <span style="color: #000000">);&nbsp;&nbsp;<br />
</span><span style="color: #008080">13</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />tx2.commit();&nbsp;&nbsp;<br />
</span><span style="color: #008080">14</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />user.setUserType(</span> <span style="color: #000000">1</span> <span style="color: #000000">);&nbsp;&nbsp;<br />
</span><span style="color: #008080">15</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />tx.commit();&nbsp;&nbsp;<br />
</span><span style="color: #008080">16</span> <span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /> </span></div>
<p>执行以上代码，代码将在tx.commit()处抛出<font color="#0000ff"><strong>StaleObjectStateException</strong></font>异 常，并指出版本检查失败，当前事务正在试图提交一个过期数据。通过捕捉这个异常，我 们就可以在乐观锁校验失败时进行相应处理。&nbsp;</p>
<br />
<br />
<br />
悲观锁与乐观锁的比较: <br />
悲观锁大多数情况下依靠数据库的锁机制实现，以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销，特别是对长事务而言，这样的开销往往无法承受; <br />
相对悲观锁而言，乐观锁机制采取了更加宽松的加锁机制。乐观锁机制往往基于系统中的数据存储逻辑，因此也具备一定的局限性，如在上例中，由于乐观锁机制是在我们的系统中实现，来自外部系统的更新操作不受我们系统的控制，因此可能会造成脏数据被更新到数据库中。在 <br />
系统设计阶段，我们应该充分考虑到这些情况出现的可能性，并进行相应调整（如将乐观锁策略在数据库存储过程中实现，对外只开放基于此存储过程的数据更新途径，而不是将数据库表直接对外公开）。 <br />
Hibernate 在其数据访问引擎中内置了乐观锁实现。如果不用考虑外部系统对数据库的更新操作，利用Hibernate提供的透明化乐观锁实现，将大大提升我们的生产力。 <br />
Hibernate中可以通过class描述符的optimistic-lock属性结合version描述符指定。 <br />
optimistic-lock属性有如下可选取值： <br />
&#216; none <br />
无乐观锁 <br />
&#216; version <br />
通过版本机制实现乐观锁 <br />
&#216; dirty <br />
通过检查发生变动过的属性实现乐观锁 <br />
&#216; all <br />
通过检查所有属性实现乐观锁 <br />
其中通过version实现的乐观锁机制是Hibernate官方推荐的乐观锁实现，同时也是Hibernate中，目前唯一在数据对象脱离Session发生修改的情况下依然有效的锁机制。因此，一般情况下，我们都选择version方式作为Hibernate乐观锁实现机制。 <br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/203445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-28 11:56 <a href="http://www.blogjava.net/baoyaer/articles/203445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通用Dao  设计 2</title><link>http://www.blogjava.net/baoyaer/articles/203382.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 28 May 2008 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/203382.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/203382.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/203382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/203382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/203382.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 泛型是JDK1.5的一个新的特性，使用泛型机制编写的程序代码要比那些杂乱的使用Object变量，然后再进行强制类型转换的代码具有更好的安全性和可读性。如果你的系统运行在JDK1.5以上的版本上，建议多使用泛型来代替无休止的对象转换。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在软件设计中我们开始对系统进行三层甚至是多层架构了，...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/203382.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/203382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-28 09:23 <a href="http://www.blogjava.net/baoyaer/articles/203382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 3 Formulas（翻译） </title><link>http://www.blogjava.net/baoyaer/articles/203193.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 27 May 2008 05:01:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/203193.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/203193.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/203193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/203193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/203193.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; <a href="http://www.hibernate.org/">Hibernate</a> 和 <a href="http://www.springframework.org/">Spring</a> 这两个突出的开源框架被越来越多的应用到 J2EE 中。尽管目标有着不同的问题空间，它们却共享一个关键特性：<a href="http://martinfowler.com/articles/injection.html">依赖注入</a>。在对象返回到客户端之前 Spring 协助挑选出这些对象间依赖关系，减少客户端代码量。而 Hibernate 专门挑选出在完整的对象模型返回客户端之前由数据模型表现的依赖关系。当使用 JDBC 直接从数据模型映射到对象模型时，我们通常需要书写大量的代码来构建对象模型。Hibernate 的出现淘汰了这种繁琐的编码工作。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Hibernate 2.x 提供基本的表到对象的映射，标准关联映射（包括 one-to-one, one-to-many 以及 many-to-many 关系），多态映射，等等。Hibernate 3.x 沿着路线继续前进，formula、filter、subselect 等，使映射更加灵活，提供用细粒度的解释特性。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 在本文中，将阐述 formula 到底有哪些特性可帮助我们进行模型转换。Hibernate 3.x 之前，formula 属性只能出现在 property 元素中。但是到了现在，你可以在许多元素中使用 Hibernate 3.x 提供的 formula 属性或元素（formula 用法方面都是一样的），包括 discriminator、element、many-to-many、map-key、map-key-many-to-many、以及 property。它增加了 OR 映射的灵活性，因此允许对复杂数据模型更加细粒的解释。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 下面有两个 formula 应用场景：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 1. formula 用于评估结果的场合。在 discriminator、element、map-key、map-key-many-to-many以及 property 元素中注入 formula。<br />
&nbsp;&nbsp;&nbsp; 2. formula 用于连接目的的场合。在 many-to-one、one-to-one 以及 many-to-many 元素中注入 formula。<br />
&nbsp;&nbsp;&nbsp; <br />
<font size="4"><strong>范畴 1：从 formula 获得评估结果</strong><br />
</font>&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <strong>Discriminator<br />
</strong>&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 在真实的数据 schema 中，经常出现一个表被用于描述其他表的情况。formula 可协助提供灵活的多态 OR 映射。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 在图 1 的范例中，有两个表：Product 和 ProductRelease。每条 product 记录都有一个 ProductReleaseID 参考相应的产品出厂记录，包括 product release name、type、release date 等等。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height="338" alt="Product and Product Release Data Model" src="http://www.onjava.com/onjava/2005/08/03/graphics/image001.jpg" width="344" /><br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 1. Product 和 product release<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ProductRelease 表中有个有趣的属性 SubProductAllowable，该属性的值为 1 或 0。值为 1 代表允许任何的次品出厂，但是 0 不允许次品出厂。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 图 2 展示了由数据模型解释的对象模型。Nested 接口定义了 getSubProducts 和 setSubProducts 方法。NestedProduct 类继承 Product 基类并实现 Nested 接口。无论产品数据记录是 Product 或 NestedProduct，都取决于产品出厂记录中 SubProductAllowable 的值。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height="333" alt="Product and Product Release Object Domain Model" src="http://www.onjava.com/onjava/2005/08/03/graphics/image002.jpg" width="375" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 2. Product 和产品出厂对象域模型<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 为了完成模型转换，我们使用如下的 Hibernate 3.x 映射：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<font color="#000080"><hibernate-mapping>
<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="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Product"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;discriminator-value</span><span style="color: #0000ff">="0"</span><span style="color: #ff0000">&nbsp;&nbsp;lazy</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="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">id&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="id"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="long"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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">discriminator&nbsp;<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">formula</span><span style="color: #0000ff">="(select&nbsp;pr.SubProductAllowable&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;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;ProductRelease&nbsp;pr&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;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;pr.productReleaseID=<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;productReleaseID)"</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;type</span><span style="color: #0000ff">="integer"</span><span style="color: #ff0000">&nbsp;</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">subclass&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="NestedProduct"</span><span style="color: #ff0000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;discriminator-value</span><span style="color: #0000ff">="1"</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;</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>
<p></font>&nbsp;&nbsp;&nbsp; 如果 formula 表达式评估结果为 0 时－－也就是不允许次品出厂－－那么对象将是 Product 类。如果结果是 1，那么对象将是 NestedProduct。在表 1 和 2 中，表 Product 的第一条记录（ProductID=10000001），已初始化的类将是 NestedProduct，因为它参考一条 SubProductAllowable=1 的 ProductRelease 记录。表 Product 的第二条记录（ProductID=20000001），已初始化的类将是 Product，因为它参考一条 SubProductAllowable=0 的 ProductRelease 记录。<br />
&nbsp;&nbsp;&nbsp;
<table width="46%" border="1">
    <tbody>
        <tr>
            <td width="10%">S/N</td>
            <td width="35%"><code><font color="#003366">ProductReleaseID</font></code></td>
            <td width="35%"><code><font color="#003366">SubProductAllowable</font></code></td>
            <td width="20%">...</td>
        </tr>
        <tr>
            <td>1</td>
            <td>11</td>
            <td>1</td>
            <td>&#161;&shy;</td>
        </tr>
        <tr>
            <td>2</td>
            <td>601</td>
            <td>0</td>
            <td>&#161;&shy;</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表 1. ProductRelease 表中的记录<br />
&nbsp;&nbsp;&nbsp;
<table width="46%" border="1">
    <tbody>
        <tr>
            <td width="10%">S/N</td>
            <td width="35%"><code><font color="#003366">ProductID</font></code></td>
            <td width="35%"><code><font color="#003366">ProductReleaseID</font></code></td>
            <td width="20%">...</td>
        </tr>
        <tr>
            <td>1</td>
            <td>10000001</td>
            <td>11</td>
            <td>&#161;&shy;</td>
        </tr>
        <tr>
            <td>2</td>
            <td>20000001</td>
            <td>601</td>
            <td>...</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表 2. Product 表中的记录<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <strong>Property<br />
</strong>&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 在 property 元素中的 formula 允许对象属性包含特定引伸值，比如对结果进行 sum、average、max 等等。</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: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="averagePrice"</span><span style="color: #ff0000">&nbsp;formula</span><span style="color: #0000ff">="(select&nbsp;avg(pc.price)&nbsp;from&nbsp;PriceCatalogue&nbsp;pc,&nbsp;SelectedItems&nbsp;si&nbsp;where&nbsp;si.priceRefID=pc.priceID)"</span><span style="color: #0000ff">/&gt;</span></div>
<p>&nbsp;&nbsp;&nbsp; 此外，formula 也能协助从基于当前记录的特定值向其它表检索数据。例如：</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: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="currencyName"</span><span style="color: #ff0000">&nbsp;formula</span><span style="color: #0000ff">="(select&nbsp;cur.name&nbsp;from&nbsp;currency&nbsp;cur&nbsp;where&nbsp;cur.id=&nbsp;currencyID)"</span><span style="color: #0000ff">/&gt;</span></div>
<p>&nbsp;&nbsp;&nbsp; 这将由助于从 currency 表检索 currency name。正如你所看到的，这样直接映射可消除许多转换编码。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <strong>map-key</strong><br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; formula 允许 map-key 持有任何可能的值。下列范例（图 3），我们想让 Role_roleID 成为对象模型的 map-key（图 4）。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height="417" alt="User Role Data Schema" src="http://www.onjava.com/onjava/2005/08/03/graphics/image003.jpg" width="316" />&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 3. 用户角色数据 schema<br />
<br />
&nbsp;&nbsp; <img height="180" alt="User Role Object Model" src="http://www.onjava.com/onjava/2005/08/03/graphics/image004.jpg" width="431" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图 4. 用户角色对象模型<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 在前面的数据 schema 中，User 和 Role 由 User_has_Role 通过 many-to-many 关系关联调用。为了获取某个 User 所有的指派角色，我们进行如下映射：<font color="#000080"><hibernate-mapping></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: #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="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="User"</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">id&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="userID"</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">map&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="roles"</span><span style="color: #ff0000">&nbsp;&nbsp;<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">="UserRole"</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;</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_userID"</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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">map-key&nbsp;<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">formula</span><span style="color: #0000ff">="Role_RoleID"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff">="string"</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;</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;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="Role_RoleID"</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">="Role"</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">map</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;</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="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Role"</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">id&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="roleID"</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;</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>
<p></font>&nbsp;&nbsp;&nbsp; Role_RoleID 通常用于连接 many-to-many 元素的栏位值。Hibernate 通常不允许 Role_RoleID 出现在 map-key 和 many-to-many 的栏位属性中。但是有了 formula，Role_RoleID 也能用于 map-key。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <strong>element、map-key-many-to-many 以及其他<br />
</strong>&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; element 和 property 类似，能从任何有效的 formula 表达式赋予评估值。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; map-key-many-to-many 中 formula 的用法类似于 map-key。但是，map-key-many-to-many 通常用于三重关系，map key 是一个被自己参考的对象，而不是被参考的属性。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 那么，到底哪些情况下 formula 不支持呢？有些数据库（例如 Oracle 7）就不支持嵌入式 select 语句（也就是说一条 select SQL 内嵌在另外一条 select SQL 语句中），这种情况 formula 就不支持评估结果。因此，你应该首先检查嵌入式 select SQL 语句是否被支持。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 一旦 Hibernate 的映射拿 formula 表达式作为 select SQL 选取的一部分，请确认数据库 SQL 方言是否允许使用 formula，尽管这样将降低代码轻便性。<br />
&nbsp;&nbsp;&nbsp; <br />
<strong><font size="4">范畴 2：formula 用于连接</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; <strong>many-to-one<br />
</strong>&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 另一个普遍的场景是真实世界的数据模型是所有者关系映射，这意味着映射是不同于 one-to-one、one-to-many 以及 many-to-many 关系的，formula 是提供所有者关系管理元素中的一个。图 5 展示了某公司可有多个联系人，但是其中只有一个为默认联系人的范例。一个公司有多个联系人是典型的 one-to-many 关系。但是，为了标识默认联系人，ContactPerson 表使用了 defaultFlag 参数（1 是 yes, 0是 no）。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height="327" src="http://www.onjava.com/onjava/2005/08/03/graphics/image005.jpg" width="272"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图 5. 用户角色数据 schema<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height="121" src="http://www.onjava.com/onjava/2005/08/03/graphics/image006.jpg" width="281"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 6. 用户角色对象模型<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 为了说明对象模型（图 6）中默认联系人关系，我们使用如下映射文件：<font color="#000080"></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: #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="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Company"</span><span style="color: #ff0000">&nbsp;table</span><span style="color: #0000ff">="Company"</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">id&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="id"</span><span style="color: #ff0000">&nbsp;</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">many-to-one&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultContactPerson"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property-ref</span><span style="color: #0000ff">="defaultContactPerson"</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">column&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="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">formula</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">formula</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-one</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;</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="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Person"</span><span style="color: #ff0000">&nbsp;</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">id&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="id"</span><span style="color: #ff0000">&nbsp;</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">properties&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultContactPerson"</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">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="companyID"</span><span style="color: #ff0000">&nbsp;</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">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultFlag"</span><span style="color: #ff0000">&nbsp;</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">properties</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;</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>
<p></font>&nbsp;&nbsp;&nbsp; 如上，我们把 companyID 和 defaultFlag 组织到名为 defaultContactPerson 的 properties 元素中，做为 Person 表的 unique key。Company 类中的 many-to-one 元素连接 Person 表的 defaultContactPerson properties 元素。输出的 SQL 像这样：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <font color="#000080">select c.id, p.id from Company c, Person p where p.companyID=c.id and p.defaultFlag=1<br />
</font>&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <strong>one-to-one</strong><br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Hibernate 中，one-to-one 主要用于两张表共享同一主键的情况。对于外键关联，我们通常使用 many-to-one 来代替。但是，有了 formula，one-to-one 可以通过外键连接表。上面的 many-to-one 范例可以通过 one-to-one 来映射：</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: #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="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Company"</span><span style="color: #ff0000">&nbsp;table</span><span style="color: #0000ff">="Company"</span><span style="color: #ff0000">&nbsp;</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">id&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="id"</span><span style="color: #ff0000">&nbsp;</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">one-to-one&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultContactPerson"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property-ref</span><span style="color: #0000ff">="defaultContactPerson"</span><span style="color: #ff0000">&nbsp;</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">formula</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">id</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">formula</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">formula</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">formula</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">one-to-one</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;</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="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Person"</span><span style="color: #ff0000">&nbsp;</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">id&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="id"</span><span style="color: #ff0000">&nbsp;</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">properties&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultContactPerson"</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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="companyID"</span><span style="color: #ff0000">&nbsp;</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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultFlag"</span><span style="color: #ff0000">&nbsp;</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">properties</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;</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>
<p>&nbsp;&nbsp;&nbsp; <strong>many-to-many<br />
</strong>&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; formula 用于当 many-to-many 元素为关系表和实体表连接的特殊关系，尽管通常没有必要这样用。<br />
&nbsp;&nbsp;&nbsp; <br />
<strong><font size="4">总结</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; 文章范例展示了大部分 formula 的适用情景。当需要 formula 评估值时，formula 表达式将出现在 产生的 SQL 语句的 select 部分。当 formula 用于连接时，它出现在产生的 SQL 语句的 where 部分。此外，formula 表达式可用于任何 SQL 方言，只要目标数据库支持。最后，formula 可协助完成从数据模型到对象模型的无代码细粒度映射。<br />
<br />
<br />
<strong><font face="宋体" color="#ff0000" size="2">请注意！引用、转贴本文应注明原译者：Rosen Jiang 以及出处：</font></strong><a href="http://www.blogjava.net/rosen/rosen/rosen/rosen"><font face="宋体" color="#ff0000" size="2"><strong>http://www.blogjava.net/rosen</strong></font></a></p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/203193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-27 13:01 <a href="http://www.blogjava.net/baoyaer/articles/203193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate集合映射inverse和cascade详解</title><link>http://www.blogjava.net/baoyaer/articles/203186.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 27 May 2008 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/203186.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/203186.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/203186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/203186.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/203186.html</trackback:ping><description><![CDATA[１、到底在哪用cascade="..."？<br />
cascade属性并不是多对多关系一定要用的，有了它只是让我们在插入或删除对像时更方便一些，只要在cascade的源头上插入或是删除，所有cascade的关系就会被自己动的插入或是删除。便是为了能正确的cascade，unsaved-value是个很重要的属性。Hibernate通过这个属性来判断一个对象应该save还是update，如果这个对象的id是unsaved-value的话，那说明这个对象不是persistence object要save（insert)；如果id是非unsaved-value的话，那说明这个对象是persistence object（数据库中已存在），只要update就行了。saveOrUpdate方法用的也是这个机制。<br />
<br />
２、到底在哪用inverse="ture"?<br />
inverse属性默认是false的，就是说关系的两端都来维护关系。这个意思就是说，如有一个Student, Teacher和TeacherStudent表，Student和Teacher是多对多对多关系，这个关系由TeacherStudent这个表来表现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢？在用hibernate时，我们不会显示的对TeacherStudent表做操作。对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看hbm文件中指定的是"谁"维护关系，那个在插入或删除"谁"时，就会处发对关系表的操作。前提是"谁"这个对象已经知道这个关系了，就是说关系另一头的对象已经set或是add到"谁"这个对象里来了。前面说过inverse默认是false，就是关系的两端都维护关系，对其中任一个操作都会处发对表系表的操作。当在关系的一头，如Student中的bag或set中用了inverse＝"true"时，那就代表关系是由另一关维护的（Teacher）。就是说当这插入Student时，不会操作TeacherStudent表，即使Student已经知道了关系。只有当Teacher插入或删除时才会处发对关系表的操作。所以，当关系的两头都用inverse="true"是不对的，就会导致任何操作都不处发对关系表的操作。当两端都是inverse="false"或是default值是，在代码对关系显示的维护也是不对的，会导致在关系表中插入两次关系。<br />
在一对多关系中inverse就更有意义了。在多对多中，在哪端inverse="true"效果差不多（在效率上）。但是在一对多中，如果要一方维护关系，就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update操作，因为关系就是在多方的对象中的，直指插入或是删除多方对象就行了。当然这时也要遍历"多"方的每一个对象显示的操作修关系的变化体现到DB中。不管怎样说，还是让"多"方维护关系更直观一些。<br />
<br />
３、cascade和inverse有什么区别？<br />
可以这样理解，cascade定义的是关系两端对象到对象的级联关系；而inverse定义的是关系和对象的级联关系。<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">all&nbsp;:&nbsp;所有情况下均进行关联操作。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />none：所有情况下均不进行关联操作。这是默认值。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />save-update:在执行save/update/saveOrUpdate时进行关联操作。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />delete：在执行delete时进行关联操作。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<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="" />all的意思是save-update&nbsp;+&nbsp;delete&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />all-delete-orphan&nbsp;的意思是当对象图中产生孤儿节点时,在数据库中删除该节点&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />all比较好理解,举个例子说一下all-delete-orphan:&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Category与Item是一对多的关系,也就是说Category类中有个Set类型的变量items.&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />举个例子,现items中存两个Item,&nbsp;item1,item2,如果定义关系为all-delete-orphan&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />当items中删除掉一个item(比如用remove()方法删除item1),那么被删除的Item类实例&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />将变成孤儿节点,当执行category.update(),或session.flush()时&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />hibernate同步缓存和数据库,会把数据库中item1对应的记录删掉&nbsp;</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/203186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-27 12:37 <a href="http://www.blogjava.net/baoyaer/articles/203186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>采用p6spy完整显示hibernate的SQL语句 [zt]</title><link>http://www.blogjava.net/baoyaer/articles/203156.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 27 May 2008 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/203156.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/203156.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/203156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/203156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/203156.html</trackback:ping><description><![CDATA[<div class="postTitle">&nbsp;</div>
<p>作者：邱洋<br />
QQ：1964477<br />
<br />
&nbsp;&nbsp;&nbsp; 虽然在hibernate中有show_sql选项，但是显示出来的语句大多类似<br />
&nbsp;&nbsp;&nbsp; select * from xxx where value=?<br />
&nbsp;&nbsp;&nbsp; 但是有时候我们需要得到完整的SQL语句，怎么办呢？使用P6SPY就可以完成这个任务</p>
<p>&nbsp;&nbsp;&nbsp; p6spy是一个开源软件，它可以跟踪任何使用jdbc的应用产生的数据库操作。特别适合于监控ejb服务器产生的 sql statements。<br />
&nbsp;&nbsp;&nbsp; 官方网址：<a href="http://www.p6spy.com/">http://www.p6spy.com/</a><br />
&nbsp;&nbsp;&nbsp; 目前p6spy 适用的应用服务器包括jboss, atg, orion, jonas, iplanet, weblogic, websphere, resin and tomcat.</p>
<p>下面我介绍一下p6spy在tomcat应用程序上安装的步骤：<br />
（1）<a href="http://www.p6spy.com/download.html">http://www.p6spy.com/download.html</a>，下载zip包<br />
（2）解压出p6spy.jar spy.properties两个文件<br />
（3）将p6spy.jar 放入应用程序的WEB-INF/lib目录，将spy.properties放入WEB-INF/classes目录<br />
（4）修改spy.properties</p>
<p>&nbsp;&nbsp;&nbsp; realdriver&nbsp; =com.mysql.jdbc.Driver&nbsp; 将这行前面的#去掉<br />
&nbsp;&nbsp;&nbsp; logfile&nbsp;&nbsp;&nbsp;&nbsp; = c:/spy.log&nbsp; 修改一个你需要的日志文件名<br />
&nbsp;&nbsp;&nbsp; <br />
（5）修改hibernate.xml，修改connection.driver_class的值为com.p6spy.engine.spy.P6SpyDriver<br />
（6）重启tomcat<br />
（7）这样在c:/下的spy.log记录了数据库的访问情况。</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/203156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-27 11:27 <a href="http://www.blogjava.net/baoyaer/articles/203156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring +hibernate 启动优化【转】</title><link>http://www.blogjava.net/baoyaer/articles/194713.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 22 Apr 2008 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/194713.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/194713.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/194713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/194713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/194713.html</trackback:ping><description><![CDATA[<p>最近在负责一个大项目，项目组成员包括项目经理大概10个人左右。项目技术用struts+spring+hibernate实现。项目的规<br />
模相对来说是比较大的，总共有10大模块，每个大模块又分为有十几个、甚至几十个小模块。开发工具用eclipse，由于在<br />
开发阶段，项目开发成员需要频繁重启服务器。在启动服务器的时候，每次启动时间总是会超过1分钟。记得以前在做另外<br />
一个项目时，启动时间不到5秒钟，相差了10倍，而且项目规模是差不多的。</p>
<p>从初步分析来说，应该是hibernate解释hbm.xml时花费时间，或者可能是spring容器启动并解释所有的bean配置文件 。诊<br />
断了一下，发现1分钟消耗的时间主要分布在hibernate解释hbm.xml花费5秒；spring容器从启动到解释bean配置文件竟然<br />
花了58秒，真是太嚣张了。当时非常怀疑spring的效率问题。企图从网上搜索相关资料，看看有什么优化措施。<br />
<br />
首先是找到了hibernate的启动优化 http://www.hibernate.org/194.html&nbsp; 里面的主要思想是通过将xml序列花到本地的<br />
文件里，每次读取的时候根据情况，从本地文件读取并反序列化，节省了hibernate xml的解析时间。按照这个方式测试了<br />
一下，发现hibernate的启动时间从5秒降低到3秒，但是这个优化对于整个启动过程是杯水车薪的，毫无用处。<br />
下面是hibernate的优化代码：<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 id="Codehighlighter1_77_1405_Open_Image" onclick="this.style.display='none'; Codehighlighter1_77_1405_Open_Text.style.display='none'; Codehighlighter1_77_1405_Closed_Image.style.display='inline'; Codehighlighter1_77_1405_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_77_1405_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_77_1405_Closed_Text.style.display='none'; Codehighlighter1_77_1405_Open_Image.style.display='inline'; Codehighlighter1_77_1405_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Configuration&nbsp;addCachableFile(String&nbsp;xmlFile)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;MappingException&nbsp;</span><span id="Codehighlighter1_77_1405_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_77_1405_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_99_1235_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_1235_Open_Text.style.display='none'; Codehighlighter1_99_1235_Closed_Image.style.display='inline'; Codehighlighter1_99_1235_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_99_1235_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_99_1235_Closed_Text.style.display='none'; Codehighlighter1_99_1235_Open_Image.style.display='inline'; Codehighlighter1_99_1235_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_99_1235_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_99_1235_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;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(xmlFile);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;lazyfile&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(xmlFile&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">.bin</span><span style="color: #000000">"</span><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;&nbsp;&nbsp;&nbsp;&nbsp;org.dom4j.Document&nbsp;doc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;errors&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList();<br />
<img id="Codehighlighter1_385_682_Open_Image" onclick="this.style.display='none'; Codehighlighter1_385_682_Open_Text.style.display='none'; Codehighlighter1_385_682_Closed_Image.style.display='inline'; Codehighlighter1_385_682_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_385_682_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_385_682_Closed_Text.style.display='none'; Codehighlighter1_385_682_Open_Image.style.display='inline'; Codehighlighter1_385_682_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(file.exists()&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;lazyfile.exists()&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;file.lastModified()</span><span style="color: #000000">&lt;</span><span style="color: #000000">lazyfile.lastModified())&nbsp;</span><span id="Codehighlighter1_385_682_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_385_682_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000">"</span><span style="color: #000000">Mapping&nbsp;lazy&nbsp;file:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;lazyfile.getPath());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;oip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ObjectInputStream(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileInputStream(lazyfile));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(org.dom4j.Document)&nbsp;oip.readObject();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oip.close();&nbsp;<br />
<img id="Codehighlighter1_689_1053_Open_Image" onclick="this.style.display='none'; Codehighlighter1_689_1053_Open_Text.style.display='none'; Codehighlighter1_689_1053_Closed_Image.style.display='inline'; Codehighlighter1_689_1053_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_689_1053_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_689_1053_Closed_Text.style.display='none'; Codehighlighter1_689_1053_Open_Image.style.display='inline'; Codehighlighter1_689_1053_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_689_1053_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_689_1053_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xmlHelper.createSAXReader(xmlFile,&nbsp;errors,&nbsp;entityResolver).read(&nbsp;file&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000">"</span><span style="color: #000000">Writing&nbsp;lazy&nbsp;file&nbsp;to&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;lazyfile);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;oup&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ObjectOutputStream(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileOutputStream(lazyfile));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oup.writeObject(doc);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oup.flush();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oup.close();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><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;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;errors.size()</span><span style="color: #000000">!=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MappingException(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">invalid&nbsp;mapping</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;(Throwable)&nbsp;errors.get(</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(doc);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1265_1399_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1265_1399_Open_Text.style.display='none'; Codehighlighter1_1265_1399_Closed_Image.style.display='inline'; Codehighlighter1_1265_1399_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1265_1399_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1265_1399_Closed_Text.style.display='none'; Codehighlighter1_1265_1399_Open_Image.style.display='inline'; Codehighlighter1_1265_1399_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_1265_1399_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_1265_1399_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;&nbsp;&nbsp;&nbsp;&nbsp;log.error(</span><span style="color: #000000">"</span><span style="color: #000000">Could&nbsp;not&nbsp;configure&nbsp;datastore&nbsp;from&nbsp;file:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;xmlFile,&nbsp;e);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MappingException(e);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
没办法，又仔细查看了spring的资料，终于发现spring的容器是提供了lazy-load的，即默认的缺省设置是bean没有lazy- load，<br />
该属性处于false状态，这样导致spring在启动过程导致在启动时候，会默认加载整个对象实例图，从初始化ACTION配置、<br />
到 service配置到dao配置、乃至到数据库连接、事务等等。这么庞大的规模，难怪spring的启动时间要花将近1分钟。尝<br />
试了一下，把beans的 default-lazy-init改为true就，再次启动，速度从原来的55秒，降到8秒钟！！Great！虽然是非常<br />
小一个改动，但是影响确实非常大。一个项目组10个人，假若每个人一天平均需要在eclipse下启动测试服务器50次。那么<br />
一天项目组需要重启500次，每次节省50秒的话，就是 25000秒，将近几个小时，差不多一个工作日，多么可观的数字！<br />
<p>&nbsp;<br />
不过在运行期间第一次点页面的时候，由于spring做了lazy-load，现在就需要启动一部分需要的beans，所以稍微慢2－3<br />
&nbsp;秒钟，但是明显比等几十秒要快很多，值得一鉴。</p>
<p>&nbsp;以上是针对开发阶段的spring容器启动优化，在部署到实际环境中，倒是没必要设置为lazy-load。毕竟部署到实际环境<br />
&nbsp;中不是经常的事，每次启动1分钟倒不是大问题。 </p>
<p>我这里要提醒的是不是说有的beans都能设置default-lazy-init成为true.对于scheduler的bean不能用lazy-init<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: #0000ff">&lt;</span><span style="color: #800000">&nbsp;beans&nbsp;&nbsp;</span><span style="color: #ff0000">default-lazy-init&nbsp;</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;bean&nbsp;&nbsp;</span><span style="color: #ff0000">class&nbsp;</span><span style="color: #0000ff">="org.springframework.scheduling.quartz.SchedulerFactoryBean"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;property&nbsp;&nbsp;</span><span style="color: #ff0000">name&nbsp;</span><span style="color: #0000ff">="triggers"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&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;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;list&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="buildHtmlTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="askTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="mailSenderTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="topicDetailBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="forumBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="topicBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;list&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;property&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;bean&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<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">&nbsp;beans&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
这样的话。所有的scheduler就都不管用了。所以请大家要注意。下面这样才是可以执行的<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">&nbsp;beans&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;bean&nbsp;&nbsp;</span><span style="color: #ff0000">class&nbsp;</span><span style="color: #0000ff">="org.springframework.scheduling.quartz.SchedulerFactoryBean"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;property&nbsp;&nbsp;</span><span style="color: #ff0000">name&nbsp;</span><span style="color: #0000ff">="triggers"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&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;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;list&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="buildHtmlTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="askTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="mailSenderTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="topicDetailBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="forumBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="topicBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&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;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;list&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;property&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;bean&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<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">&nbsp;beans&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/194713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-04-22 11:00 <a href="http://www.blogjava.net/baoyaer/articles/194713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Could not initialize proxy - the owning Session was closed ---Hibernate与延迟加载：</title><link>http://www.blogjava.net/baoyaer/articles/175250.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 14 Jan 2008 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/175250.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/175250.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/175250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/175250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/175250.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 延迟初始化错误是运用Hibernate开发项目时最常见的错误。如果对一个类或者集合配置了延迟检索策略，那么必须当代理类实例或代理集合处于持久化状态（即处于Session范围内）时，才能初始化它。如果在游离状态时才初始化它，就会产生延迟初始化错误。Could&nbsp;not&nbsp;initialize&nbsp;proxy下面把Customer.hbm.xml文件的&lt;...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/175250.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/175250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-14 16:54 <a href="http://www.blogjava.net/baoyaer/articles/175250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate.cfg.xml配置 </title><link>http://www.blogjava.net/baoyaer/articles/172642.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 04 Jan 2008 01:12:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/172642.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/172642.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/172642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/172642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/172642.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Hibernate的描述文件可以是一个properties属性文件，也可以是一个xml文件。下面讲一下Hibernate.cfg.xml的配置。配置格式如下：1. 配置数据源在Hibernate.cfg.xml中既可以配置JDBC，也可以配置JNDI。在本小节中讲述数据源如何配置,hibernate.cfg.xml&lt;?xml&nbsp;version="1.0"&nbsp;enc...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/172642.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/172642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-04 09:12 <a href="http://www.blogjava.net/baoyaer/articles/172642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate部分问题总结</title><link>http://www.blogjava.net/baoyaer/articles/172246.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 02 Jan 2008 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/172246.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/172246.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/172246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/172246.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/172246.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 缓存问题：Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;&nbsp;&nbsp; /** &nbsp;使用&nbsp;Query.executeUpdate()&nbsp;缓存中数据不同步&nbsp;解决办法&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/172246.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/172246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-02 16:31 <a href="http://www.blogjava.net/baoyaer/articles/172246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hbn 拦截器 [zt]</title><link>http://www.blogjava.net/baoyaer/articles/172244.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 02 Jan 2008 08:23:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/172244.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/172244.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/172244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/172244.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/172244.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 拦截器import&nbsp;&nbsp;java.io.Serializable;import&nbsp;&nbsp;java.util.HashSet;import&nbsp;&nbsp;java.util.Iterator;import&nbsp;&nbsp;java.util.Set;import&nbsp;&nbsp;org.hibernate.CallbackE...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/172244.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/172244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-02 16:23 <a href="http://www.blogjava.net/baoyaer/articles/172244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate cache2 </title><link>http://www.blogjava.net/baoyaer/articles/166844.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 11 Dec 2007 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/166844.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/166844.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/166844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/166844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/166844.html</trackback:ping><description><![CDATA[<div class="postbody">在hibernate.cfg.xml 中添加缓存&nbsp; t1oo 一对多 t2oo (t2ooSet)<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">property&nbsp;</span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">="cache.provider_class"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">org.hibernate.cache.EhCacheProvider</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">property</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">property&nbsp;</span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">="hibernate.cache.use_query_cache"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">true</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">property</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">mapping&nbsp;</span><span style="color: rgb(255,0,0)">resource</span><span style="color: rgb(0,0,255)">="hbn/bean/T1oo.hbm.xml"</span><span style="color: rgb(255,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">mapping&nbsp;</span><span style="color: rgb(255,0,0)">resource</span><span style="color: rgb(0,0,255)">="hbn/bean/T2oo.hbm.xml"</span><span style="color: rgb(255,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">class-cache&nbsp;</span><span style="color: rgb(255,0,0)">class</span><span style="color: rgb(0,0,255)">="hbn.bean.T1oo"</span><span style="color: rgb(255,0,0)">&nbsp;usage</span><span style="color: rgb(0,0,255)">="read-only"</span><span style="color: rgb(255,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">collection-cache&nbsp;</span><span style="color: rgb(255,0,0)">collection</span><span style="color: rgb(0,0,255)">="hbn.bean.T1oo.t2ooSet"</span><span style="color: rgb(255,0,0)">&nbsp;usage</span><span style="color: rgb(0,0,255)">="read-only"</span><span style="color: rgb(255,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">class-cache&nbsp;</span><span style="color: rgb(255,0,0)">class</span><span style="color: rgb(0,0,255)">="hbn.bean.T2oo"</span><span style="color: rgb(255,0,0)">&nbsp;usage</span><span style="color: rgb(0,0,255)">="read-only"</span><span style="color: rgb(255,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span></div>
<br />
在src根目录下 ehcache.xml <strong><font color="#a52a2a"></font></strong><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,255)">&lt;?</span><span style="color: rgb(255,0,255)">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: rgb(0,0,255)">?&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">ehcache</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">diskStore&nbsp;</span><span style="color: rgb(255,0,0)">path</span><span style="color: rgb(0,0,255)">="java.io.tmpdir"</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">defaultCache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255,0,0)">maxElementsInMemory</span><span style="color: rgb(0,0,255)">="10000" <font color="#006400">//最大缓存数目</font></span><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eternal</span><span style="color: rgb(0,0,255)">="false"</span><font color="#006400">＜!-- 缓存是否持久 --＞</font><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeToIdleSeconds</span><span style="color: rgb(0,0,255)">="120" </span><font color="#006400">＜!-- 当缓存闲置n秒后销毁 --＞</font><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeToLiveSeconds</span><span style="color: rgb(0,0,255)">="120"</span><font color="#006400">＜!-- 当缓存存活n秒后销毁--＞</font><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;overflowToDisk</span><span style="color: rgb(0,0,255)">="true"</span><font color="#006400">＜!-- 是否保存到磁盘，当系统当机时--＞</font><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diskPersistent</span><span style="color: rgb(0,0,255)">="false"</span><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diskExpiryThreadIntervalSeconds</span><span style="color: rgb(0,0,255)">="120"</span><span style="color: rgb(0,0,255)">/&gt;<br />
<br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">cache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">="hbn.bean.T1oo"</span><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxElementsInMemory</span><span style="color: rgb(0,0,255)">="450"</span><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eternal</span><span style="color: rgb(0,0,255)">="false"</span><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeToLiveSeconds</span><span style="color: rgb(0,0,255)">="600"</span><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;overflowToDisk</span><span style="color: rgb(0,0,255)">="true"</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">ehcache</span><span style="color: rgb(0,0,255)">&gt;</span></div>
<br />
测试：<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;testCa()</span><span style="color: rgb(0,0,255)">throws</span><span style="color: rgb(0,0,0)">&nbsp;Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println( getT1ooAll()&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: rgb(0,0,0)">2</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">1000</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println( </span><span style="color: rgb(0,0,0)">getT1ooAll</span><span style="color: rgb(0,0,0)">()&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
控制台输出<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,0)">Hibernate:&nbsp;</span><span style="color: rgb(0,0,255)">select</span><span style="color: rgb(0,0,0)">&nbsp;t1oo0_.id&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;id,&nbsp;t1oo0_.name&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;name0_&nbsp;</span><span style="color: rgb(0,0,255)">from</span><span style="color: rgb(0,0,0)">&nbsp;t1oo&nbsp;t1oo0_&nbsp;limit&nbsp;?<br />
<br />
Hibernate:&nbsp;</span><span style="color: rgb(0,0,255)">select</span><span style="color: rgb(0,0,0)">&nbsp;t2ooset0_.aid&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;aid1_,&nbsp;t2ooset0_.id&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;id1_,&nbsp;t2ooset0_.id&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;id0_,&nbsp;t2ooset0_.version&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;version1_0_,&nbsp;t2ooset0_.</span><span style="color: rgb(255,0,255)">avg</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;avg1_0_,&nbsp;t2ooset0_.aid&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;aid1_0_&nbsp;</span><span style="color: rgb(0,0,255)">from</span><span style="color: rgb(0,0,0)">&nbsp;t2oo&nbsp;t2ooset0_&nbsp;</span><span style="color: rgb(0,0,255)">where</span><span style="color: rgb(0,0,0)">&nbsp;t2ooset0_.aid</span><span style="color: rgb(128,128,128)">=</span><span style="color: rgb(0,0,0)">?<br />
Hibernate:&nbsp;</span><span style="color: rgb(0,0,255)">select</span><span style="color: rgb(0,0,0)">&nbsp;t2ooset0_.aid&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;aid1_,&nbsp;t2ooset0_.id&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;id1_,&nbsp;t2ooset0_.id&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;id0_,&nbsp;t2ooset0_.version&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;version1_0_,&nbsp;t2ooset0_.</span><span style="color: rgb(255,0,255)">avg</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;avg1_0_,&nbsp;t2ooset0_.aid&nbsp;</span><span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;aid1_0_&nbsp;</span><span style="color: rgb(0,0,255)">from</span><span style="color: rgb(0,0,0)">&nbsp;t2oo&nbsp;t2ooset0_&nbsp;</span><span style="color: rgb(0,0,255)">where</span><span style="color: rgb(0,0,0)">&nbsp;t2ooset0_.aid</span><span style="color: rgb(128,128,128)">=</span><span style="color: rgb(0,0,0)">?<br />
</span><span style="font-weight: bold; color: rgb(128,0,0)">24</span><span style="color: rgb(0,0,0)">&nbsp;:&nbsp;</span><span style="font-weight: bold; color: rgb(128,0,0)">23</span><span style="color: rgb(0,0,0)">&nbsp;:&nbsp;</span><span style="font-weight: bold; color: rgb(128,0,0)">25</span><span style="color: rgb(0,0,0)">&nbsp;:&nbsp;</span><span style="font-weight: bold; color: rgb(128,0,0)">2</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)"><br />
<font color="#006400">//在这缓存成功 没向数据库提交 sql语句 </font><br />
</span><span style="font-weight: bold; color: rgb(128,0,0)">24</span><span style="color: rgb(0,0,0)">&nbsp;:&nbsp;</span><span style="font-weight: bold; color: rgb(128,0,0)">23</span><span style="color: rgb(0,0,0)">&nbsp;:&nbsp;</span><span style="font-weight: bold; color: rgb(128,0,0)">25</span><span style="color: rgb(0,0,0)">&nbsp;:&nbsp;</span><span style="font-weight: bold; color: rgb(128,0,0)">2</span></div>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/166844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-11 09:31 <a href="http://www.blogjava.net/baoyaer/articles/166844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 关于Hibernate源码 org.hibernate.hql.antlr包为空的问题。 </title><link>http://www.blogjava.net/baoyaer/articles/166678.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 10 Dec 2007 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/166678.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/166678.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/166678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/166678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/166678.html</trackback:ping><description><![CDATA[<div class="postText">down下来Hibernate3的源码看看，发现org.hibernate.hql.antlr包下是空的，看了文档（
<p>A special package for ANTLR-generated parser classes.</p>
<p><em>NOTE: The classes in this package are generated from the ANTLR grammar files, do not register them into version control.</em></p>
<p>）才明白，原来他的代码是由Antlr产生的。按照要求</p>
<p>1， 配置ANtlr， 将antlr.jar拷贝到jdk的lib下边。<img alt="" src="http://blog.csdn.net/Editor/FCKeditor/editor/images/smiley/msn/regular_smile.gif" />, 懒得写配置环境，直接拷贝到JDK的lib下方便。</p>
<p>2， 开始生成java 文件</p>
<p>&nbsp;到源码的grammar下看到有3个.g文件，首先运行&gt;java antlr.Tool hql.g</p>
<p>接着运行&gt;java antlr.Tool hql-sql.g</p>
<p>最后运行&gt;java antlr.Tool sql-gen.g</p>
<p>OK，关于HSQL的源码生成完毕，拷贝到org.hibernate.hql.antlr包下即可。</p>
<p>关于ANTLR的信息可以参考他的官方网站</p>
<p><a href="http://www.antlr.org/download/antlr-2.7.7.tar.gz">http://www.antlr.org/</a></p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/166678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-10 15:39 <a href="http://www.blogjava.net/baoyaer/articles/166678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 整合 Hibernate 的一处简化配置［转］ </title><link>http://www.blogjava.net/baoyaer/articles/166555.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 10 Dec 2007 01:05:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/166555.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/166555.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/166555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/166555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/166555.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt">在过去使用 Spring 整合 Hibernate 的时候，都是用这样的配置方式。<br />
<br />
</span>
<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"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">bean&nbsp;</span> <span style="color: #ff0000">id</span> <span style="color: #0000ff">="sessionFactory"</span> <span style="color: #ff0000">&nbsp;lazy-init</span> <span style="color: #0000ff">="true"</span> <span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span> <span style="color: #0000ff">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;</span> <span style="color: #800000">property&nbsp;</span> <span style="color: #ff0000">name</span> <span style="color: #0000ff">="mappingResources"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;</span> <span style="color: #800000">list</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;</span> <span style="color: #800000">value</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">resources/icustomer/Contact.hbm.xml</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">value</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;</span> <span style="color: #800000">value</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">resources/icustomer/Customer.hbm.xml</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">value</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">list</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">property</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">bean</span> <span style="color: #0000ff">&gt;</span> </div>
<br />
<span style="font-size: 10pt">每当需要加入一个新的 VO 时，我需要过来修改配置文件，来引入对新的 VO 的支持。</span> <br />
<br />
<span style="font-size: 10pt">现在我使用的时候，是这么配的：<br />
</span>
<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"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">bean&nbsp;</span> <span style="color: #ff0000">id</span> <span style="color: #0000ff">="sessionFactory"</span> <span style="color: #ff0000">&nbsp;lazy-init</span> <span style="color: #0000ff">="true"</span> <span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span> <span style="color: #0000ff">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;</span> <span style="color: #800000">property&nbsp;</span> <span style="color: #ff0000">name</span> <span style="color: #0000ff">="mappingLocations"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;</span> <span style="color: #800000">list</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;</span> <span style="color: #800000">value</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">classpath:resources/**/*.hbm.xml</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">value</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">list</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">property</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">bean</span> <span style="color: #0000ff">&gt;</span> </div>
<br />
<span style="font-size: 10pt">做项目开发的时候，就再也没有改过配置。</span> <br />
<br />
&lt;property name="mappingDirectoryLocations"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;list&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;classpath*:domain/mappings/&lt;/value&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/list&gt; <br />
&lt;/property&gt; <br />
还可以使用这种配置
<img src ="http://www.blogjava.net/baoyaer/aggbug/166555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-10 09:05 <a href="http://www.blogjava.net/baoyaer/articles/166555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中outer-join、lazy 、fetch join关键字的使用 </title><link>http://www.blogjava.net/baoyaer/articles/165980.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 07 Dec 2007 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/165980.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/165980.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/165980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/165980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/165980.html</trackback:ping><description><![CDATA[<div class="postbody">
<p>1、outer-<strong>join</strong>关键字(many-to-one的情况)<br />
</p>
<p>outer-<strong>join</strong>关键字有3个值，分别是true,false,auto,默认是auto。<br />
true: 表示使用外连接抓取关联的内容，这里的意思是当使用load(OrderLineItem.class,"id")时，<strong>Hibernate</strong>只生成一条SQL语句将OrderLineItem与他的父亲Order全部初始化。<br />
<br />
select * from OrderLineItem o left <strong>join</strong>&nbsp;Order&nbsp;p&nbsp;on o.OrderId=p.OrderId&nbsp;&nbsp;where o.OrderLineItem_Id=?<br />
<br />
false:表示不使用外连接抓取关联的内容，当load(OrderLineItem.class,"id")时，<strong>Hibernate</strong>生成两条SQL语句，一条查询OrderLineItem表，另一条查询Order表。这样的好处是可以设置延迟加载，此处要将Order类设置为lazy=true。<br />
<br />
select * from OrderLineItem o&nbsp;where o.OrderLineItem_Id=?<br />
select * from Order p where p.OrderId=?<br />
<br />
auto:具体是ture还是false看<strong>hibernate</strong>.cfg.xml中的配置<br />
</p>
<p>注意：如果使用HQL查询OrderLineItem，如 from OrderLineItem o where o.id='id'，总是不使用外部抓取，及outer-<strong>join</strong>失效。<br />
</p>
<p>2、outer-<strong>join</strong>(集合)<br />
<br />
由于集合可以设置lazy="true"，所以lazy与outer-<strong>join</strong>不能同时为true，当lazy="true"时，outer-<strong>join</strong>将一直是false，如果lazy="false"，则outer-<strong>join</strong>用法与1同<br />
<br />
3、HQL语句会将POJO配置文件中的关联一并查询，即使在HQL语句中没有明确<strong>join</strong>。</p>
<p>4、In HQL, the "<a name="baidusnap1"></a><strong>fetch</strong> <strong>join</strong>" clause can be used for per-query specific outer <strong>join</strong> fetching. One important thing many people miss there, is that HQL queries will ignore the outer-<strong>join</strong> attribute you specified in your mapping. This makes it possible to configure the default loading behaviour of session.load() and session.get() and of objects loaded by navigating relationship. So if you specify</p>
<pre>and then do</pre>
<pre>MyObject obj = session.createQuery("from MyObject").uniqueResult();<br />
obj.getMySet().iterator().next();<br />
</pre>
<p>you will still have an additional query and no outer-<strong>join</strong>. So you must explicily request the outer-<strong>join</strong> fetching:</p>
<pre>MyObject obj = session.createQuery(<br />
"from MyObject mo left <strong>join</strong> <strong>fetch</strong> mo.mySet").uniqueResult();<br />
obj.getMySet().iterator().next();<br />
</pre>
<p>Another important thing to know is that you can only <strong>fetch</strong> one collection reference in a query. That means you can just use one <strong>fetch</strong> <strong>join</strong>. You can however <strong>fetch</strong> "one" references in addition, as this sample from the <strong>Hibernate</strong> Docs demonstrates:</p>
<pre>from eg.Cat as cat<br />
inner <strong>join</strong> <strong>fetch</strong> cat.mate<br />
left <strong>join</strong> <strong>fetch</strong> cat.kittens<br />
</pre>
<p>We have once considered lifting this limitation, but then decided against it, because using more than one <strong>fetch</strong>-<strong>join</strong> would be a bad idea generally: The generated ResultSet becomes huge and is a major performance loss.</p>
<p>So alltogether the "<strong>fetch</strong> <strong>join</strong>" clause is an important instrument <strong>Hibernate</strong> users should learn how to leverage, as it allows tuning the <strong>fetch</strong> behaviour of a certain use case. </p>
<p>5、<strong>join</strong> <strong>fetch</strong> 与 <strong>join</strong> 的区别</p>
<p>如果HQL使用了连接，但是没有使用<strong>fetch</strong>关键字，则生成的SQL语句虽然有连接，但是并没有取连接表的数据，还是需要单独的sql取数据，也就是 select a,b,d...中没有连接表的字段</p>
<p>6、如果集合被声明为lazy=true，在HQL中如果显式的使用 <strong>join</strong> <strong>fetch</strong> 则延迟加载失效。</p>
<p>7、在one-to-many的one端显式设置fecth="join",则无论如何都采取预先抓取（生成一个SQl），延迟加载失效(生成两个SQL)</p>
<p>8、many-to-one的延迟加载是在配置文件的class标签设置lazy="true",one-to-many和many-to- many的延迟加载是在set标签中设置lazy="true"。而one-to-one不只要在calss标签设置lazy="true",而且要在 one-to-one标签中设置constrained="true".</p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/165980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-07 10:45 <a href="http://www.blogjava.net/baoyaer/articles/165980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 多服务器数据同步问题（支持延迟同步） </title><link>http://www.blogjava.net/baoyaer/articles/165078.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 04 Dec 2007 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/165078.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/165078.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/165078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/165078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/165078.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文是本人实际开发中遇到，特留文记录。在次我花了3天的时间解决，这个问题还是点难度的。所用到知识点：一般jdk |-私有属性反射|-序列化|-正则表达使用|-多线程使用|-dom4j的xml读取|+hibernate &nbsp;&nbsp; |-拦截器&nbsp;&nbsp; |-一个Session工厂同时连接不同数据库（本文关键）&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/165078.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/165078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-04 09:37 <a href="http://www.blogjava.net/baoyaer/articles/165078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate条件查询(Criteria Query)   (Hibernate)</title><link>http://www.blogjava.net/baoyaer/articles/160191.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 13 Nov 2007 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/160191.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/160191.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/160191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/160191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/160191.html</trackback:ping><description><![CDATA[<h3 class="storytitle">&nbsp;</h3>
<div class="meta">&nbsp;</div>
<div class="content_story_Bottom"></div>
<div class="storycontent" id="storycontent">
<div align="left">
<p>
<p><font color="#993300"><font size="2"><strong>1、创建一个Criteria实例</strong><br />
net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询。Session是用来制造Criteria实例的工厂。&nbsp;</font></font></p>
<p><font color="#993300" size="2">
<pre class="scheme">
<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;crit&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sess.createCriteria(Cat.</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="" />crit.setMaxResults(</span><span style="color: #000000">50</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />List&nbsp;cats&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;crit.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
</font><br />
<font color="#993300"><font size="2"><strong>2、缩小结果集范围</strong><br />
一个查询条件(Criterion)是net.sf.hibernate.expression.Criterion接口的一个实例。类net.sf.hibernate.expression.Expression定义了获得一些内置的Criterion类型。&nbsp;</font></font>
<p>&nbsp;</p>
<p><font color="#993300" size="2">
<pre class="scheme">
<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">List&nbsp;cats&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sess.createCriteria(Cat.</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="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Fritz%</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.between(</span><span style="color: #000000">"</span><span style="color: #000000">weight</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;minWeight,&nbsp;maxWeight)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
表达式（Expressions）可以按照逻辑分组.&nbsp;</font>
<p>&nbsp;</p>
<p><font color="#993300" size="2">
<pre class="scheme">
<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">List&nbsp;cats&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sess.createCriteria(Cat.</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="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Fritz%</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.or(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Expression.eq(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;),<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Expression.isNull(</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="" />&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />List&nbsp;cats&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff">class</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_299_322_Open_Image" onclick="this.style.display='none'; Codehighlighter1_299_322_Open_Text.style.display='none'; Codehighlighter1_299_322_Closed_Image.style.display='inline'; Codehighlighter1_299_322_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_299_322_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_299_322_Closed_Text.style.display='none'; Codehighlighter1_299_322_Open_Image.style.display='inline'; Codehighlighter1_299_322_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.in(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[]&nbsp;</span><span id="Codehighlighter1_299_322_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_299_322_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Fritz</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Izi</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Pk</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000">&nbsp;)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.disjunction()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.isNull(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.eq(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.eq(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.eq(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">2</span><span style="color: #000000">)&nbsp;)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
有很多预制的条件类型（Expression的子类）。有一个特别有用，可以让你直接嵌入SQL。&nbsp;</font>
<p>&nbsp;</p>
<p><font color="#993300" size="2">&nbsp;</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">List&nbsp;cats&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sess.createCriteria(Cat.</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="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.sql(</span><span style="color: #000000">"</span><span style="color: #000000">lower($alias.name)&nbsp;like&nbsp;lower(?)</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Fritz%</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;Hibernate.STRING)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>其中的{alias}是一个占位符，它将会被所查询实体的行别名所替代。(原文:The&nbsp;{alias}&nbsp;placeholder&nbsp;with&nbsp;be&nbsp;replaced&nbsp;by&nbsp;the&nbsp;row&nbsp;alias&nbsp;of&nbsp;the&nbsp;queried&nbsp;entity.)&nbsp;</font></p>
<p><font color="#993300"><font size="2"><strong>3、对结果排序</strong><br />
可以使用net.sf.hibernate.expression.Order对结果集排序.&nbsp;</font></font></p>
<p><font color="#993300" size="2">
<pre class="scheme">
<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">List&nbsp;cats&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sess.createCriteria(Cat.</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="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">F%</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(</span><span style="color: #000000">50</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
<strong>4、关联（Associations）</strong><br />
你可以在关联之间使用createCriteria()，很容易地在存在关系的实体之间指定约束。&nbsp;</font>
<p>&nbsp;</p>
<p><font color="#993300" size="2">
<pre class="scheme">
<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">List&nbsp;cats&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sess.createCriteria(Cat.</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="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">F%</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria(</span><span style="color: #000000">"</span><span style="color: #000000">kittens</span><span style="color: #000000">"</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;.add(&nbsp;Expression.like(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">F%</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
注意，第二个createCriteria()返回一个Criteria的新实例，指向kittens集合类的元素。&nbsp;</font>
<p>&nbsp;</p>
<p><font color="#993300" size="2">下面的替代形式在特定情况下有用。&nbsp;</font></p>
<p><font color="#993300"><font size="2">&nbsp;</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">List&nbsp;cats&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sess.createCriteria(Cat.</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="" />&nbsp;&nbsp;&nbsp;&nbsp;.createAlias(</span><span style="color: #000000">"</span><span style="color: #000000">kittens</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">kt</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.createAlias(</span><span style="color: #000000">"</span><span style="color: #000000">mate</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">mt</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.eqProperty(</span><span style="color: #000000">"</span><span style="color: #000000">kt.name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">mt.name</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>（createAlias()）并不会创建一个Criteria的新实例。）&nbsp;</font></font></p>
<p><font color="#993300" size="2">请注意，前面两个查询中Cat实例所持有的kittens集合类并没有通过criteria预先过滤！如果你希望只返回满足条件的kittens,你必须使用returnMaps()。&nbsp;</font></p>
<p><font color="#993300" size="2">
<pre class="scheme">
<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">List&nbsp;cats&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sess.createCriteria(Cat.</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="" />&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria(</span><span style="color: #000000">"</span><span style="color: #000000">kittens</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">kt</span><span style="color: #000000">"</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;.add(&nbsp;Expression.eq(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">F%</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.returnMaps()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Iterator&nbsp;iter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cats.iterator();<br />
<img id="Codehighlighter1_213_336_Open_Image" onclick="this.style.display='none'; Codehighlighter1_213_336_Open_Text.style.display='none'; Codehighlighter1_213_336_Closed_Image.style.display='inline'; Codehighlighter1_213_336_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_213_336_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_213_336_Closed_Text.style.display='none'; Codehighlighter1_213_336_Open_Image.style.display='inline'; Codehighlighter1_213_336_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(&nbsp;iter.hasNext()&nbsp;)&nbsp;</span><span id="Codehighlighter1_213_336_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_213_336_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Map)&nbsp;iter.next();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;cat&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Cat)&nbsp;map.get(Criteria.ROOT_ALIAS);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;kitten&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Cat)&nbsp;map.get(</span><span style="color: #000000">"</span><span style="color: #000000">kt</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
</font><font color="#993300"><font size="2"><strong>5、动态关联对象获取（Dynamic&nbsp;association&nbsp;fetching）<br />
</strong>可以在运行时通过setFetchMode()来改变关联对象自动获取的策略。&nbsp;</font></font>
<p>&nbsp;</p>
<p><font color="#993300" size="2">
<pre class="scheme">
<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">List&nbsp;cats&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sess.createCriteria(Cat.</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="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Fritz%</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.setFetchMode(</span><span style="color: #000000">"</span><span style="color: #000000">mate</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;FetchMode.EAGER)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
这个查询会通过外连接(outer&nbsp;join)同时获得&nbsp;mate和kittens。&nbsp;</font>
<p>&nbsp;</p>
<p><font color="#993300"><font size="2"><strong>6、根据示例查询（Example&nbsp;queries）</strong><br />
net.sf.hibernate.expression.Example类允许你从指定的实例创造查询条件。&nbsp;</font></font></p>
<p><font color="#993300" size="2">
<pre class="scheme">
<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">Cat&nbsp;cat&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Cat();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />cat.setSex(</span><span style="color: #000000">'</span><span style="color: #000000">F</span><span style="color: #000000">'</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />cat.setColor(Color.BLACK);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />List&nbsp;results&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createCriteria(Cat.</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="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(cat)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
<br />
版本属性，表示符属性和关联都会被忽略。默认情况下，null值的属性也被排除在外。&nbsp;</font>
<p>&nbsp;</p>
<p><font color="#993300" size="2">You&nbsp;can&nbsp;adjust&nbsp;how&nbsp;the&nbsp;Example&nbsp;is&nbsp;applied.&nbsp;你可以调整示例(Example)如何应用。&nbsp;</font></p>
<p><font color="#993300" size="2">
<pre class="scheme">
<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">Example&nbsp;example&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Example.create(cat)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.excludeZeroes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">exclude&nbsp;zero&nbsp;valued&nbsp;properties</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;.excludeProperty(</span><span style="color: #000000">"</span><span style="color: #000000">color</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">exclude&nbsp;the&nbsp;property&nbsp;named&nbsp;"color"</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;.ignoreCase()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">perform&nbsp;case&nbsp;insensitive&nbsp;string&nbsp;comparisons</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;.enableLike();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">use&nbsp;like&nbsp;for&nbsp;string&nbsp;comparisons</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">List&nbsp;results&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createCriteria(Cat.</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="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(example)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
你甚至可以用示例对关联对象建立criteria。&nbsp;</font>
<p>&nbsp;</p>
<p><font color="#993300" size="2">
<pre class="scheme">
<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">List&nbsp;results&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createCriteria(Cat.</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="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(cat)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria(</span><span style="color: #000000">"</span><span style="color: #000000">mate</span><span style="color: #000000">"</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;.add(&nbsp;Example.create(&nbsp;cat.getMate()&nbsp;)&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
</font>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/160191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-11-13 12:53 <a href="http://www.blogjava.net/baoyaer/articles/160191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 分页</title><link>http://www.blogjava.net/baoyaer/articles/157459.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 01 Nov 2007 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/157459.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/157459.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/157459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/157459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/157459.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 分页在任何系统中都是非常头疼的事情，有的数据库在语法上支持分页，而有的数据库则需要使用可滚动游标来实现，并且在不支持可滚动游标的系统上只能使用单向游标逐步接近要取得的数据。&nbsp;Hibernate提供了一个支持跨系统的分页机制，这样无论底层是什么样的数据库都能用统一的接口进行分页操作。比如下面的代码就是从第500条开始取出100条记录:&nbsp;Query&nbsp;q&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/157459.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/157459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-11-01 13:04 <a href="http://www.blogjava.net/baoyaer/articles/157459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个范型的Dao通用类</title><link>http://www.blogjava.net/baoyaer/articles/157101.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 31 Oct 2007 01:18:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/157101.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/157101.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/157101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/157101.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/157101.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 首先说明，这个东西最开始是我从网上找到的，但是不记得在那里找到的了。只是觉得非常有用，所以就根据我的需要做了修改，放在了这里，当作一个备忘录吧。这个是接口：/**&nbsp; &nbsp;&nbsp;* @author Fred&nbsp; &nbsp;&nbsp;* Jun 25, 2007 5:52:47 PM&nbsp; &nbsp;&nbsp;*/&nbsp; &n...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/157101.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/157101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-31 09:18 <a href="http://www.blogjava.net/baoyaer/articles/157101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 显示 SQL 语句中 ? 的值 </title><link>http://www.blogjava.net/baoyaer/articles/131186.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 19 Jul 2007 00:49:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/131186.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/131186.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/131186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/131186.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/131186.html</trackback:ping><description><![CDATA[1、比较方便的办法<br>在 log4j 的配置中加上<br><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><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">logger&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="org.hibernate.type"</span><span style="COLOR: #ff0000">&nbsp;additivity</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>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">level&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="debug"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">appender-ref&nbsp;</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="CONSOLE"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">appender-ref&nbsp;</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="FILE"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">logger</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">logger&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="org.hibernate.sql"</span><span style="COLOR: #ff0000">&nbsp;additivity</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>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">level&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="debug"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">appender-ref&nbsp;</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="CONSOLE"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">appender-ref&nbsp;</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="FILE"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">logger</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>其中 org.hibernate.sql 不知道有什么用。<br><br>2、使用 p6spy 来显示 sql，配合 sqlprofile 比较方便，还可以使用 irontracksql。<br><br>sqlprofile 和 irontracksql 在得到 sql 的机制有些差别。<br><br>sqlprofile 是通过配置 log4j 的 socket append ，将 log 输出到 sqlprofile 的监听端口去。这样在调试程序的时候，只要先启动好 sqlprofile，就能得到 sql 了。<br><br>irontracksql 是在应用中监听一个端口，随应用启动，irontracksql 启动是连接到那个端口去得到 sql，所以要先启动用户，再让 irontracksql 连过去。<br><br>猜测：irontracksql 性能会好一些，而且不想看 sql 可以断下来。sqlprofile 则不行。但在调试程序的时候 sqlprofile 明显方便很多。 
<img src ="http://www.blogjava.net/baoyaer/aggbug/131186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-07-19 08:49 <a href="http://www.blogjava.net/baoyaer/articles/131186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在基于Spring及Hibernate应用程序中使用ETags降低带宽占用和服务器压力</title><link>http://www.blogjava.net/baoyaer/articles/130470.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 16 Jul 2007 01:02:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/130470.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/130470.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/130470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/130470.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/130470.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 导言REST方式的应用程序构架在近日所产生的巨大影响突出了Web应用程序的优雅设计的重要性。现在人们开始理解&#8220;WWW架构&#8221;内在的可测量性及弹性，并且已经开始探索使用其范例的更好的方式。在本文中，我们将讨论一个Web应用开发工具——&#8220;简陋的、卑下的&#8221;ETags，以及如何在基于SpringFramework的动态Web应用程序中集成这个工具，来提高应...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/130470.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/130470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-07-16 09:02 <a href="http://www.blogjava.net/baoyaer/articles/130470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用缓存提高小型站点性能 </title><link>http://www.blogjava.net/baoyaer/articles/126843.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 28 Jun 2007 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/126843.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/126843.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/126843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/126843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/126843.html</trackback:ping><description><![CDATA[<div class=postText>
<p>最近结束了一个小型网站项目，主要功能就是一个文章系统，为了提升站点性能，我在首页上使用了OSCache，在访问首页时，性能的确有不小的提升(具体数据见《JMeter小实验——JSP性能简单测试》)，但我对此并不满足，打算使用Hibernate的二级缓存来优化访问文章和栏目时的速度。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate的二级缓存有很多选择，我选择了默认的EHCache。它的配置十分简单，只要在Hibernate配置里加入</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> <span style="COLOR: #000000">hibernate.cache.provider_class</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">net.sf.hibernate.cache.EhCacheProvider</span> </div>
<p>然后在Classpath里加入EHCache.xml文件，我的文件内容如下：</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> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">ehcache</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">diskStore&nbsp;path</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">java.io.tmpdir</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">/&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">defaultCache<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxElementsInMemory</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">1000</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eternal</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">false</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeToIdleSeconds</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">600</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeToLiveSeconds</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">600</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;overflowToDisk</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">false</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #000000">/&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #000000">&lt;/</span> <span style="COLOR: #000000">ehcache</span> <span style="COLOR: #000000">&gt;</span> </div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JavaEye上的《hibernate二级缓存攻略》对这些属性有如下说明：</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> <span style="COLOR: #000000">eternal表示缓存是不是永远不超时<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>timeToLiveSeconds是缓存中每个元素(这里也就是一个POJO)的超时时间，如果eternal</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">false</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">，超过指定的时间，这个元素就被移走了。<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>timeToIdleSeconds是发呆时间，是可选的。当往缓存里面put的元素超过500个时，如果overflowToDisk</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">true</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">，就会把缓存中的部分数据保存在硬盘上的临时文件里面。</span> </div>
<p>注意：我的配置中最大元素设成了1000。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果希望每个缓存的POJO有自己的配置，可以把defaultCache换成cache name="com.xxx.pojo.Foo"。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 完成了EHCache.xml的配置，接下来在每个要被缓存的POJO映射 文件里加入</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> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">cache&nbsp;usage</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">read-write</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">/&gt;</span> </div>
<p>其中read-write是缓存策略，Hibernate还有read-only、nonstrict-read-write和transactional这些策略以供选择。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置完成后，我用JMeter测试，发现头两次访问的时间很长，但随后的访问速度有很大提升，数字上相差两位呢。虽然在实际使用时还有网络等因素会影响站点的访问，不过总的来说对于这样的小型文章系统，二级缓存的使用还是对整体性能有帮助的。最后要做的就是根据实际使用情况，适当调整一下缓存设置，我用SpringAOP建立了一个处理日志的拦截器，记录访问量和访问间隔，先让它运行一段时间，随后根据日志情况对缓存作调整。</p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/126843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-06-28 16:21 <a href="http://www.blogjava.net/baoyaer/articles/126843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate自定义生成主健</title><link>http://www.blogjava.net/baoyaer/articles/122289.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 06 Jun 2007 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/122289.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/122289.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/122289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/122289.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/122289.html</trackback:ping><description><![CDATA[<p>现在做的项目有一个需求:在不多维护一张表的情况下,自动生成主键,同sequence一样,而且要有一定的规范.比如,现在我们的规范是yymmddhhmmss+四位流水号.没有办法,只好对hibernate的主键生成做自定义.下面是我的代码,请多多指教.<br><br>声明,我的hibernate的版本是:hibernate3.2<br><br>自定义的时候,只对两个地方做了修改,一个是自己写了一个java类,实现了hibernate的IdentifierGenerator和Configurable ,另外一个地方就是对*.hbm.xml文件做修改.<br>一.<br>先说对*.hbm.xml做的修改吧,东西比较少.<br>原始的配置文件中,主键生成时,采用的是自动增加1,如下:<br>&lt;class name="com.ce.fxmgn.entity.Hold" table="HOLD"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="oid" type="java.lang.String"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="OID" length="32" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="sequence"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="sequence"&gt;seq_id&lt;/param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br>在修改后,去掉了sequence,如下:<br>&lt;class name="com.ce.fxmgn.entity.Hold" table="HOLD"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="oid" type="java.lang.String"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="OID" length="32" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="com.hello.test.po.InMemoryIncrement"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br>其中,com.hello.test.po.InMemoryIncrement便是自己写的java类.</p>
<p><br>二.扩展的java类.实现了hibernate的IdentifierGenerator和Configurable <br><br>package com.hello.test.po;</p>
<p>import org.apache.commons.logging.Log;<br>import org.apache.commons.logging.LogFactory;</p>
<p>import org.hibernate.HibernateException;<br>import org.hibernate.MappingException;</p>
<p>import org.hibernate.dialect.Dialect;</p>
<p>import org.hibernate.engine.SessionImplementor;</p>
<p>import org.hibernate.id.Configurable;<br>import org.hibernate.id.IdentifierGenerator;<br>import org.hibernate.id.PersistentIdentifierGenerator;</p>
<p>import org.hibernate.type.Type;</p>
<p>import java.io.Serializable;</p>
<p>import java.sql.Connection;<br>import java.sql.PreparedStatement;<br>import java.sql.ResultSet;<br>import java.sql.SQLException;</p>
<p>import java.util.Date;<br>import java.util.HashMap;<br>import java.util.Map;<br>import java.util.Properties;<br>import java.util.Properties;</p>
<p><br>public class InMemoryIncrement implements IdentifierGenerator, Configurable {<br>&nbsp;&nbsp;&nbsp; private static final Log log = LogFactory.getLog(InMemoryIncrement.class);</p>
<p>&nbsp;&nbsp;&nbsp; //存储最大值的数组的容量 <br>&nbsp;&nbsp;&nbsp; private static final int MAX_CAPACITY = 2000;</p>
<p>&nbsp;&nbsp;&nbsp; /**同步锁*/<br>&nbsp;&nbsp;&nbsp; private static final Object lock = new Object();</p>
<p>&nbsp;&nbsp;&nbsp; //存储表存储在数组中的索引值 <br>&nbsp;&nbsp;&nbsp; private static Map map = new HashMap();</p>
<p>&nbsp;&nbsp;&nbsp; //最大值数组 <br>&nbsp;&nbsp;&nbsp; private static long[] seqs = new long[MAX_CAPACITY];</p>
<p>&nbsp;&nbsp;&nbsp; //最大值数组已经使用的容量 <br>&nbsp;&nbsp;&nbsp; private static int lastIndex;</p>
<p>&nbsp;&nbsp;&nbsp; //递增步长，默认加1 <br>&nbsp;&nbsp;&nbsp; private int step = 1;<br>&nbsp;&nbsp;&nbsp; private String key;<br>&nbsp;&nbsp;&nbsp; private String sql;<br>&nbsp;&nbsp;&nbsp; private Connection connection;<br>&nbsp;&nbsp;&nbsp; private Class returnClass;</p>
<p>&nbsp;&nbsp;&nbsp; public Serializable generate(SessionImplementor session, Object object)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws HibernateException {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection = session.connection();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long seq = -1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //找到索引值 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index = findIndex();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //把最大值加1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; seqs[index] = seqs[index] + step;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; seq = seqs[index];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到流水号,是自己写的工具类生成的.形式为000x<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String seqStr = JspFormate.currentFormateORM(seq);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到yymmdd,是自己写的方法工具类生成的yymmdd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String preDate = JspFormate.dateFormateYYYYMMDD(new Date()).substring(2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到hhmmss,是自己写的工具类获取的hhmmss<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String preHour = JspFormate.dateFormateOnlyHHMMSSORM(new Date());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return preDate + preHour + seqStr;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 找到表中自动增长字段存储在数组中的索引值<br>&nbsp;&nbsp;&nbsp;&nbsp; * @return 索引值<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private int findIndex() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //首先中缓存中取出索引值 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer integer = (Integer) map.get(key);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果没有找到就从数据库中读出最大值并进行cache <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null == integer) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //double check lock <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (lock) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer = (Integer) map.get(key);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null == integer) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long maxvalue = 1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxvalue = getMaxvalue();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error(e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxvalue = new Long(0).longValue();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer = new Integer(lastIndex++);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; seqs[integer.intValue()] = maxvalue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put(key, integer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index = integer.intValue();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return index;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void configure(Type type, Properties params, Dialect d)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws MappingException {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; &nbsp;取出table参数 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String table = params.getProperty("table");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (table == null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table = params.getProperty(PersistentIdentifierGenerator.TABLE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取出column参数 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String column = params.getProperty("column");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (column == null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; column = params.getProperty(PersistentIdentifierGenerator.PK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //表的sehcma参数 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String schema = params.getProperty(PersistentIdentifierGenerator.SCHEMA);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnClass = type.getReturnedClass();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取出step参数 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String stepvalue = params.getProperty("step");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((null != stepvalue) &amp;&amp; !"".equals(stepvalue.trim())) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; step = Integer.parseInt(stepvalue);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error(e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //构造存储在Map中的索引值的key name <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key = table + "_$_" + column;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //根据参数构造取最大值的SQL <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql = "select max(" + column + ") from ";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null != schema) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql += (schema + ".");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql += table;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 取指定表中id字段的最大值，不存在记录返回0<br>&nbsp;&nbsp;&nbsp;&nbsp; * @return 最大值<br>&nbsp;&nbsp;&nbsp;&nbsp; * @throws SQLException if sql error occurs.<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private long getMaxvalue() throws SQLException {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long maxvalue = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreparedStatement st = connection.prepareStatement(sql);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("============================================" + sql);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = st.executeQuery();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rs.next()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxvalue = rs.getLong(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rs != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return maxvalue;<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/122289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-06-06 09:03 <a href="http://www.blogjava.net/baoyaer/articles/122289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate unsave-value属性 </title><link>http://www.blogjava.net/baoyaer/articles/122284.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 06 Jun 2007 00:43:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/122284.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/122284.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/122284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/122284.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/122284.html</trackback:ping><description><![CDATA[<div class=postTitle>&nbsp;</div>
unsave-value：用来控制是save还是update对象。<br>当你显式的使用session.save()或者session.update()操作一个对象的时候，实际上是用不到unsaved-value的。某些情况下(父子表关联保存)，当你在程序中并没有显式的使用save或者update一个持久对象，那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象，是一个尚未被持久化过的内存临时对象。例如：<br><br>
<div>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; FONT: smallcaption; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">Session&nbsp;session&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img 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;<img src="http://www.blogjava.net/Images/dot.gif">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Parent&nbsp;parent&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(Parent)&nbsp;session.load(Parent.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">,&nbsp;id);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Child&nbsp;child&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Child();&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>child.setParent(parent);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>child.setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sun</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>parent.addChild(child);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>s.update(parent);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>s.flush();&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>tx.commit();&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>s.close();&nbsp;&nbsp;</span></div>
</div>
<br>
<p style="FONT-FAMILY: Tahoma">在上例中，程序并没有显式的session.save(child); 那么Hibernate需要知道child究竟是一个临时对象，还是已经在数据库中有的持久对象。如果child是一个新创建的临时对象(本例中就是这种情况)，那么Hibernate应该自动产生session.save(child)这样的操作，如果child是已经在数据库中有的持久对象，那么Hibernate应该自动产生session.update(child)这样的操作。</p>
<p style="FONT-FAMILY: Tahoma">因此我们需要暗示一下Hibernate，究竟child对象应该对它自动save还是update。在上例中，显然我们应该暗示Hibernate对child自动save，而不是自动update。那么Hibernate如何判断究竟对child是save还是update呢？它会取一下child的主键属性 child.getId() ，这里假设id是 java.lang.Integer类型的。如果取到的Id值和hbm映射文件中指定的unsave-value相等，那么Hibernate认为child是新的内存临时对象，发送save，如果不相等，那么Hibernate认为child是已经持久过的对象，发送update。</p>
<p style="FONT-FAMILY: Tahoma">unsaved-value="null" (默认情况，适用于大多数对象类型主键 Integer/Long/String/...)</p>
<p style="FONT-FAMILY: Tahoma">当Hibernate取一下child的Id，取出来的是null(在上例中肯定取出来的是null)，和unsaved-value设定值相等，发送save(child)</p>
<p style="FONT-FAMILY: Tahoma">当Hibernate取一下child的id，取出来的不是null，那么和unsaved-value设定值不相等，发送update(child)</p>
<p>例如下面的情况：<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; FONT: smallcaption; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">Session&nbsp;session&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img 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;<img src="http://www.blogjava.net/Images/dot.gif">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Parent&nbsp;parent&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(Parent)&nbsp;session.load(Parent.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">,&nbsp;id);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Child&nbsp;child&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(Child)&nbsp;session.load(Child.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">,&nbsp;childId);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>child.setParent(parent);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>child.setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sun</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>parent.addChild(child);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>s.update(parent);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>s.flush();&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>tx.commit();&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>s.close();&nbsp;&nbsp;</span></div>
<br><span style="FONT-FAMILY: Tahoma">child已经在数据库中有了，是一个持久化的对象，不是新创建的，因此我们希望Hibernate发送update(child)，在该例中，Hibernate取一下child.getId()，和unsave-value指定的null比对一下，发现不相等，那么发送update(child)。<br><br>parent对象不需要操心，因为程序显式的对parent有load操作和update的操作，不需要Hibernate自己来判断究竟是save还是update了。我们要注意的只是child对象的操作。另外unsaved-value是定义在Child类的主键属性中的。</span><br><br>
<div>&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; FONT: smallcaption; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">class&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="Child"</span><span style="COLOR: #ff0000">&nbsp;table</span><span style="COLOR: #0000ff">="child"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">id&nbsp;</span><span style="COLOR: #ff0000">column</span><span style="COLOR: #0000ff">="id"</span><span style="COLOR: #ff0000">&nbsp;name</span><span style="COLOR: #0000ff">="id"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="integer"</span><span style="COLOR: #ff0000">&nbsp;unsaved-value</span><span style="COLOR: #0000ff">="null"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">generator&nbsp;</span><span style="COLOR: #ff0000">class</span><span style="COLOR: #0000ff">="identity"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">id</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><img src="http://www.blogjava.net/Images/dot.gif">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img 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">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
</div>
<br>如果主键属性不是对象型，而是基本类型，如int/long/double/...，那么你需要指定一个数值型的unsaved-value，例如：<br>
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; FONT: smallcaption; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">unsaved-value="0"</span></div>
</div>
<br>很多人以为对主键属性定义为int/long，比定义为Integer/Long运行效率来得高，认为基本类型不需要进行对象的封装和解构操作，因此喜欢把主键定义为int/long的。但实际上，Hibernate内部总是把主键转换为对象型进行操作的，就算你定义为int/long型的，Hibernate内部也要进行一次对象构造操作，返回给你的时候，还要进行解构操作，效率可能反而低也说不定。因此大家一定要扭转一个观点，在Hibernate中，主键属性定义为基本类型，并不能够比定义为对象型效率来的高，而且也多了很多麻烦，因此建议大家使用对象型的Integer/Long定义主键.<br>
<img src ="http://www.blogjava.net/baoyaer/aggbug/122284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-06-06 08:43 <a href="http://www.blogjava.net/baoyaer/articles/122284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 学习总结</title><link>http://www.blogjava.net/baoyaer/articles/113505.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 25 Apr 2007 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/113505.html</guid><description><![CDATA[1.域对象之间的关系：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 关联（一对多，多对多），依赖（用到其它对象的方法或属性），聚集（整体和部分），一般化（继承）<br />
<br />
2.域对象与数据库之间的关系<br />
<img height="146" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/canImageupload/hibernate1.jpg" width="656" border="0" /><br />
<br />
&nbsp;但是，表之间只能通过外键来表示关联关系。其它关系都是借助hibernate的配置来实现的。<br />
<br />
<br />
3.sql语句的实现：<br />
&nbsp; hibernate会在初始化阶段预定义一些insert,update,delete语句，保存在sessionFactory缓存中。<br />
&nbsp; 在hibernate初始化初期，就会根据映射文件配置信息，为持久化对象预定义sql语句,并保存在sessionFactory缓存中(HQL则是在程序运行是动态生成)：<br />
&nbsp; insert,update,delete,select,默认情况包括对象的所有字段，可以设置为不包括（适用insert/update）。<br />
<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">proprety&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="XXX&nbsp;"</span><span style="color: #ff0000">&nbsp;insert</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="XXX"</span><span style="color: #0000ff">&gt;</span></div>
<br />
&nbsp;&nbsp;property的formula指定一个SQL表达式（引用表字段，调用ＳＱＬ函数，子查询）&nbsp;&nbsp;，当表中不从在某属性在表中不存在映射字段时用formula.<br />
<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">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="totlaprice"</span><span style="color: #ff0000">&nbsp;formula</span><span style="color: #0000ff">="(select&nbsp;sum(price)&nbsp;form&nbsp;table)"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;//子查询</span></div>
<br />
<br />
<br />
<br />
4.hibernate API 接口分类:<br />
<br />
&nbsp; 访问数据库操作（insert,delete,update,query），有session,traction,quert..<br />
&nbsp; 配置接口Configuration.<br />
&nbsp; 回调接口（应用程序接受hibernate内部事件并作出相应回应）Inteceptor..，<br />
&nbsp; 扩展接口<br />
&nbsp; 同时，hibernate内部分装了jndi&amp;&amp;jta，可以使hibernate和j2ee服务器集成。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <img height="345" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/canImageupload/hibernate2.jpg" width="442" border="0" /><br />
&nbsp; Configuration:配置并启动根hibernate，创建sessionFactory对象。<br />
&nbsp; sessionFactory：对应一个数据存储源。应用从sessionFactory中获得session.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory缓存分两种：内置（hibernate配置信息，映射元数据信息），外置是一个可配置的缓存插件，存放大量的数据库数据拷贝，介 质可以是内存或硬盘<br />
<br />
5. session：<br />
&nbsp;&nbsp; session是轻量级的，通常将一个session实例和一个数据库事务绑定。session实现类中定义了java集合，构成了session缓存&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 src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Session&nbsp;session</span><span style="color: #000000">=</span><span style="color: #000000">sessionFactory.openSession();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />Traction&nbsp;tx</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_67_144_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_144_Open_Text.style.display='none'; Codehighlighter1_67_144_Closed_Image.style.display='inline'; Codehighlighter1_67_144_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_67_144_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_67_144_Closed_Text.style.display='none'; Codehighlighter1_67_144_Open_Image.style.display='inline'; Codehighlighter1_67_144_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">try</span><span id="Codehighlighter1_67_144_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_67_144_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;tx</span><span style="color: #000000">=</span><span style="color: #000000">session.beingTraction();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">开始一个事务</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;..<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">提交一个事务</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;tx.commit();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_163_197_Open_Image" onclick="this.style.display='none'; Codehighlighter1_163_197_Open_Text.style.display='none'; Codehighlighter1_163_197_Closed_Image.style.display='inline'; Codehighlighter1_163_197_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_163_197_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_163_197_Closed_Text.style.display='none'; Codehighlighter1_163_197_Open_Image.style.display='inline'; Codehighlighter1_163_197_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)</span><span id="Codehighlighter1_163_197_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_163_197_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(tx</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;tx.rollback()<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_205_224_Open_Image" onclick="this.style.display='none'; Codehighlighter1_205_224_Open_Text.style.display='none'; Codehighlighter1_205_224_Closed_Image.style.display='inline'; Codehighlighter1_205_224_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_205_224_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_205_224_Closed_Text.style.display='none'; Codehighlighter1_205_224_Open_Image.style.display='inline'; Codehighlighter1_205_224_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />}</span></span><span style="color: #0000ff">finally</span><span id="Codehighlighter1_205_224_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_205_224_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;session.close()<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
&nbsp;session缓存（减少数据库访问频率，保持缓存对象与数据库同步）：<br />
<br />
<br />
<img height="175" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/canImageupload/hibernate5.jpg" width="638" border="0" /><br />
&nbsp;&nbsp;<br />
&nbsp; &nbsp;session.close()清理缓存。<br />
&nbsp;&nbsp; session的setFlushModel()设定清理缓存的时间。<br />
<img height="132" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/canImageupload/hibernate6.jpg" width="802" border="0" /><br />
<br />
<br />
<br />
6.hibernate访问持久化对象<br />
<br />
&nbsp; <img height="179" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/canImageupload/hibernate3.jpg" width="709" border="0" /><br />
应用程序：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用getXXX()把信息输出到用户端，调用setXXX把用户的输入信息写道Coustom对象中<br />
Hibernate:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用&nbsp;Coustom的getXXX(),把得到的信息保存到数据库，调用Coustom的setXXX(),把数据库信息写道Coustom对象中.<br />
<br />
&nbsp;&nbsp;&nbsp;一般我们不会在持久化对象中加入业务逻辑代码，列外总是有的。hibernate可以访问任何方法（包括private,应用程序做不到）。 <br />
<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 id="Codehighlighter1_29_75_Open_Image" onclick="this.style.display='none'; Codehighlighter1_29_75_Open_Text.style.display='none'; Codehighlighter1_29_75_Closed_Image.style.display='inline'; Codehighlighter1_29_75_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_29_75_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_29_75_Closed_Text.style.display='none'; Codehighlighter1_29_75_Open_Image.style.display='inline'; Codehighlighter1_29_75_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setXXX(&nbsp;Object&nbsp;o)</span><span id="Codehighlighter1_29_75_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_29_75_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.o</span><span style="color: #000000">=</span><span style="color: #000000">o;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">插入业务逻辑代码</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;caculate();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">结束</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span></div>
<br />
<br />
7.持久化对象配置：<br />
&nbsp; 应用程序按内存地址区分对象，hibernate按对象标志符区分对象(&lt;id元素表示对象标志符&gt;)，对象标志符3不变（不为空，不修改，不重复）。<br />
&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: #0000ff">&lt;</span><span style="color: #800000">id&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="name"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="name"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="string"</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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">generator&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="assigned"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">//assigned表示由应用程序赋值<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">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="" /><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">version&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="version"</span><span style="color: #ff0000">&nbsp;&nbsp;column</span><span style="color: #0000ff">="version"</span><span style="color: #ff0000">&nbsp;unsaved-value</span><span style="color: #0000ff">="0"</span><span style="color: #0000ff">/&gt;&nbsp; //name不可能为空，所以只能通过version版本控制来表示临时和游离对象</span></div>
<br />
8.关联映射<br />
&nbsp; 关系数据库只存在外键参照关系（总是"many"参照"one"）,即只支持一对多/多对一。<br />
<img height="126" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/canImageupload/hibernate4.jpg" width="406" border="0" /><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 id="Codehighlighter1_20_84_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_84_Open_Text.style.display='none'; Codehighlighter1_20_84_Closed_Image.style.display='inline'; Codehighlighter1_20_84_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_20_84_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_20_84_Closed_Text.style.display='none'; Codehighlighter1_20_84_Open_Image.style.display='inline'; Codehighlighter1_20_84_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Coustom</span><span id="Codehighlighter1_20_84_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_20_84_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ID;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span>Set orders=new HashSet(); //一对多关系中<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">access&nbsp;method</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_105_173_Open_Image" onclick="this.style.display='none'; Codehighlighter1_105_173_Open_Text.style.display='none'; Codehighlighter1_105_173_Closed_Image.style.display='inline'; Codehighlighter1_105_173_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_105_173_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_105_173_Closed_Text.style.display='none'; Codehighlighter1_105_173_Open_Image.style.display='inline'; Codehighlighter1_105_173_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Orders</span><span id="Codehighlighter1_105_173_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_105_173_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ID;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Coustom&nbsp;coustom;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //多对一中，只有'many'方需要引用one'方,'one'方则不需要知道'many'方<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">access&nbsp;method</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp; Orders中映射配置代码（多对一）：<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">many-to-one&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="coustom"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="coustom_id"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="Coustom"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"><br />
&nbsp;cascade</font><span style="color: #0000ff">="save-update"</span>&nbsp;&nbsp;&nbsp; //级联保存更新</span><span style="color: #ff0000"><br />
&nbsp;not-null</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span></div>
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Coustom中映射配置代码（一对多）：<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">set&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="orders"</span><span style="color: #ff0000">&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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">key&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="coustom_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;</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">="Orders"</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">set</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;9: 对象的状态转换<br />
<br />
&nbsp; 临时态：不在session缓存中，不在数据库中<br />
&nbsp; 持久态：总是被一个session实例（位于session缓存中），session在清理缓存时，会根据持久化对象属性变化，同步数据库<br />
&nbsp; 游离态：不再session缓存中，保存在数据库中<br />
<img height="376" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/canImageupload/hibernate7.jpg" width="551" border="0" /><br />
session的Load&amp;Get:<br />
<br />
Load返回游离对象本身,在加载不存在OID对象时报错。<br />
Get返回游离对象的副本拷贝，会立刻访问数据库，在加载不存在OID对象时返回null.</p>
<p><br />
10：聚集映射（组件可嵌套配置）<br />
&nbsp;对应用程序按照精粒度设计原则，尽量提高代码重用性。对关系数据库尽可能减少表的数量，这样一个表可以对应多个类。<br />
<br />
<br />
<br />
<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/canImageupload/hibernate8.jpg" border="0" /><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 id="Codehighlighter1_20_59_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_59_Open_Text.style.display='none'; Codehighlighter1_20_59_Closed_Image.style.display='inline'; Codehighlighter1_20_59_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_20_59_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_20_59_Closed_Text.style.display='none'; Codehighlighter1_20_59_Open_Image.style.display='inline'; Codehighlighter1_20_59_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;coustom</span><span id="Codehighlighter1_20_59_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_20_59_Open_Text"><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span> Long&nbsp; id;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Address&nbsp;homeaddress;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_82_157_Open_Image" onclick="this.style.display='none'; Codehighlighter1_82_157_Open_Text.style.display='none'; Codehighlighter1_82_157_Closed_Image.style.display='inline'; Codehighlighter1_82_157_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_82_157_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_82_157_Closed_Text.style.display='none'; Codehighlighter1_82_157_Open_Image.style.display='inline'; Codehighlighter1_82_157_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Address</span><span id="Codehighlighter1_82_157_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_82_157_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp; <br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;//Address没有OID,因为不需要通过session保存，更新。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;city;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;street;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;zipcode;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">private</span><span style="color: #000000">&nbsp; String province;<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">private</span><span style="color: #000000">&nbsp; </span>Coustom coustom; //所属的整体类<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p><br />
&nbsp;配置代码：</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: #0000ff">&lt;</span><span style="color: #800000">component&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="homeaddress"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="Address"</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">parent&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="coustom"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;&nbsp;&nbsp; //指定Address所属的整体类</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">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="street"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="home_street"</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">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="city"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="home_city"</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">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="province"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="home_province"</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">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="zipcode"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="home_zipcode"</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">component</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="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
11.hibernate检索策略（延迟检索、立即检索、左外连接检索）<br />
<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/113505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-04-25 13:38 <a href="http://www.blogjava.net/baoyaer/articles/113505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 映射优化 and 加载机制</title><link>http://www.blogjava.net/baoyaer/articles/93205.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 11 Jan 2007 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/93205.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/93205.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/93205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/93205.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/93205.html</trackback:ping><description><![CDATA[1。<font color="#000000"><strong>面向设计的映射：</strong></font><br />　　使用组件（无id的实体类），把一些信息归类<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"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">component name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">contact</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">entiy.Contact</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">addr</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">string</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            column</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">addr</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">    <br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tel</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">string</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            column</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tel</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">    <br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">component</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><br />2。<strong>面向性能的映射： <br /></strong>  在hibernate 3中使用延迟加载技术; <br />  在hiberntae2中采用继承方法，把数据大的字段分派在子类中，父类只保留简单字段即可；同时，配置文件更改<br /><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"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">parent</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        table</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Tuser</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        optimistic</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">lock</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">version</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">id<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            column</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">int</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            unsaved</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />           </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">generator </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sequence</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sequence</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">TUSER_SEQ</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">generator</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">string</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            column</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                    </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span></div><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"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">children</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        table</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Tuser</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        optimistic</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">lock</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">version</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <font color="#ff0000">polymorphism</font></span><font color="#ff0000"><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">explicit</span><span style="COLOR: #000000">"      <font color="#008000"> //指名这个类是个多态，只有则指定类是才会查询，否则不会查询（如：from object）,只会查询parent，只有（from children）才会查旬</font></span></font><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">id<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            column</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">int</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            unsaved</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />           </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">generator </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sequence</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sequence</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">TUSER_SEQ</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">generator</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">    <br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property<br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">string</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            column</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                   </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />           </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property<br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">blog</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">blog</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            column</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">blog</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                   </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span></div><br /><br />hibernate 加载机制：<br />1。延迟加载： 这个比较常用，即在用到关联数据时才进行查询。&lt;lazy="true"&gt; <br /><font color="#ff0000"><strong>在hibernate2中默认为false,但在hibernate3中默认为ture，<br /></strong></font>因为这点我曾经有过一段常时间的困惑<br /><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"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">select tuser0_.id as id0_0_, tuser0_.name as name0_0_, tuser0_.addr as addr0_0_, tuser0_.tel as tel0_0_ from Tuser tuser0_ where tuser0_.id</span><span style="COLOR: #000000">=?</span></div> <br />当时用到延迟加载时，hibernate使用代理类动态的创建对象，真正的对象位于CGLIB$CALLBACK$TARGET对象中，我们获得的对象是一个ＣＧＬＩＢ代理类，只有当真正用到数据时，代理类才会检查被代理对象是否存在，如存在，返回被代理对象数据，如不存在，则去进行ｈｉｂｅｒｎａｔｅ查询<br /><br /><br />在集合属性查询时，如果使用了延迟加载，则当session关闭后，是无法得到集合属性的，我们可以通过Hibernate.initialize()强制加载集合对象<br /><br /><br />2.即时加载： 查询时同时做一次对关联数据的查询&lt;lazy="false"&gt;<br /><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" /><span style="COLOR: #000000">Hibernate: select tuser0_.id as id0_0_, tuser0_.name as name0_0_, tuser0_.addr as addr0_0_, tuser0_.tel as tel0_0_ from Tuser tuser0_ where tuser0_.id</span><span style="COLOR: #000000">=?</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Hibernate: select games0_.userid as userid1_, games0_.id as id1_, games0_.id as id1_0_, games0_.name as name1_0_, games0_.userid as userid1_0_ from Tgame games0_ where games0_.userid</span><span style="COLOR: #000000">=?</span></div><br /><br />即时加载时，当调用session.load()时hibernate执行一次数据库查询，然后直接赋值给对象<br />3.预先加载：通过out jion 进行抓取，不适合一对多等查询<br /><br /><br />4。批量加载<br />在批量处理时，一级缓存会把所有处理数据对象纳入一级缓存，如过数据过多，则会导致内存益处。解决办法就是用批量提交的方法<br /><br /><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" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hibernate.jdbc.batch_size</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span></div><br /><br /><br /><img src ="http://www.blogjava.net/baoyaer/aggbug/93205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-01-11 16:32 <a href="http://www.blogjava.net/baoyaer/articles/93205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HIBERNATE自定义数据类型</title><link>http://www.blogjava.net/baoyaer/articles/93184.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 11 Jan 2007 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/93184.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/93184.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/93184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/93184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/93184.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 网上关于HIBERNATE自定义类型的文章很少，今天自己测试了一下，顺便把代码帖在这里package entiy;import java.sql.PreparedStatement;import java.sql.ResultSet;public interface Email {            public int [] sqlTypes();                 //映射的...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/93184.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/93184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-01-11 15:23 <a href="http://www.blogjava.net/baoyaer/articles/93184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的Fetch [zt]</title><link>http://www.blogjava.net/baoyaer/articles/92644.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 09 Jan 2007 08:48:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/92644.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/92644.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/92644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/92644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/92644.html</trackback:ping><description><![CDATA[<div class="postTitle">&nbsp;</div>
<div class="postText">越来越发现其实掌握 hibernate并不容易，Spring用起来其实简单多了，但是在用hibernate的时候真的是需要一定的时间积累，对一个项目组来说如果采用hibernate最好有一个对hibernate比较清楚的人否则碰到问题就会成为项目的风险。<br />
我想告诉各位的是，掌握hibernate可能比你预期的难多了，当你轻松的告诉我，hibernate很简单的时候该是你自己多反省了. （只有一种情况例外，你是一个牛人）<br />
<br />
好了，一个引子废话那么多，其实今天只是想先说一说hibernate里的Fetch的作用.<br />
<br />
大家都知道，在hibernate里为了性能考虑，引进了lazy的概念，这里我们以Parent和Child为模型来说明，<br />
<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Parent&nbsp;</span><span style="color: rgb(0,0,255)">implements</span><span style="color: rgb(0,0,0)">&nbsp;Serializable&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">&nbsp;identifier&nbsp;field&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;Long&nbsp;id;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">&nbsp;persistent&nbsp;field&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;List&nbsp;childs;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">skip&nbsp;all&nbsp;getter/setter&nbsp;method</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp; <br />
}&nbsp;&nbsp; <br />
<br />
</span></div>
<br />
<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Child&nbsp;</span><span style="color: rgb(0,0,255)">implements</span><span style="color: rgb(0,0,0)">&nbsp;Serializable&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">&nbsp;identifier&nbsp;field&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;Long&nbsp;id;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">&nbsp;persistent&nbsp;field&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;net.foxlog.model.Parent&nbsp;parent;<br />
<br />
&nbsp;&nbsp;&nbsp; //skip all getter/setter method<br />
<br />
}</span></div>
<br />
在我们查询Parent对象的时候，默认只有Parent的内容，并不包含childs的信息，<span style="color: red">如果在Parent.hbm.xml里设置lazy="false"的话才同时取出关联的所有childs内容.<br />
<br />
Hibernate3多了fetch属性，有两种状态select和join，设置在主表一方，如：<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">set&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="addresses"</span><span style="color: #ff0000">&nbsp;inverse</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;lazy</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000">&nbsp;fetch</span><span style="color: #0000ff">="join"</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">key</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">column&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="customerid"</span><span style="color: #ff0000">&nbsp;length</span><span style="color: #0000ff">="10"</span><span style="color: #ff0000">&nbsp;</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">key</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">one-to-many&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="ch9.SimpleOneToMany.Address"</span><span style="color: #ff0000">&nbsp;</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">set</span><span style="color: #0000ff">&gt;</span></div>
<br />
<span style="color: #000000">当fetch=select的时候，我们查询从表数据时候，首先会根据主表查处主表对象，然后根据主表id生成另一个select语句去查询从表数据，产生1+N的查询效果</span><br />
<br />
</span>当fetch=join的时候，hibernate会自动用一条外连接语句同时查询主表和从表数据<br />
<br />
但有一点需要说明的是，这个fetch属性 只适用于使用get/load或creteria方式进行的查询，如果使用HQL查询则不起作用，除非在HQL中使用join操作。<br />
<br />
问题是我既想要hibernate默认的性能又想要临时的灵活性该怎么办？&nbsp; 这就是fetch的功能。我们可以把fetch与lazy="true"的关系类比为事务当中的编程式事务与声明式事务,不太准确，但是大概是这个意思。<br />
<br />
总值，fetch就是在代码这一层给你一个主动抓取得机会.<br />
<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,0)">Parent&nbsp;parent&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;(Parent)hibernateTemplate.execute(</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;HibernateCallback()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)&nbsp;</span><span style="color: rgb(0,0,255)">throws</span><span style="color: rgb(0,0,0)">&nbsp;HibernateException,&nbsp;SQLException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;q&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;session.createQuery(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">from&nbsp;Parent&nbsp;as&nbsp;parent&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;left&nbsp;outer&nbsp;join&nbsp;fetch&nbsp;parent.childs&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;where&nbsp;parent.id&nbsp;=&nbsp;:id</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.setParameter(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">id</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;Long(</span><span style="color: rgb(0,0,0)">15</span><span style="color: rgb(0,0,0)">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;(Parent)q.uniqueResult();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.assertTrue(parent.getChilds().size()&nbsp;</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">);</span></div>
<br />
<br />
你可以在lazy="true"的情况下把fetch去掉，就会报异常. 当然，如果lazy="false"就不需要fetch了<br />
<br />
<br />
有一个问题,使用Fetch会有重复记录的现象发生,我们可以理解为Fetch实际上不是为Parent服务的,而是为Child服务的.所以直接取Parent会有不匹配的问题.<br />
<br />
<span style="color: rgb(0,0,0)"><br />
<br />
参考一下下面的这篇文章<br />
<a href="http://waterye.blogdriver.com/waterye/395708.html" target="_blank">Hibernate集合初始化</a><br />
<br />
======================================================================<br />
<br />
update:以上有些结论错误，实际上在hibernate3.2.1版本下测试，可以不出现重复记录，<br />
<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;testNPlusOne()&nbsp;</span><span style="color: rgb(0,0,255)">throws</span><span style="color: rgb(0,0,0)">&nbsp;Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;(List)hibernateTemplate.execute(</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;HibernateCallback()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)&nbsp;</span><span style="color: rgb(0,0,255)">throws</span><span style="color: rgb(0,0,0)">&nbsp;HibernateException,&nbsp;SQLException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;q&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;session.createQuery(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">select&nbsp;distinct&nbsp;p&nbsp;from&nbsp;net.foxlog.model.Parent&nbsp;p&nbsp;inner&nbsp;join&nbsp;fetch&nbsp;p.childs</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;q.list();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">((Parent)(list.get(0))).getChilds();</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">list&nbsp;size&nbsp;=&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;list.size());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">;i</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">list.size();i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Parent&nbsp;p&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;(Parent)list.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">===parent&nbsp;=&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;p);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">===parent's&nbsp;child's&nbsp;length&nbsp;=&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;p.getChilds().size());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
<br />
打印结果如下:<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,0)">Hibernate:&nbsp;select&nbsp;distinct&nbsp;parent0_.id&nbsp;as&nbsp;id2_0_,&nbsp;childs1_.id&nbsp;as&nbsp;id0_1_,&nbsp;childs1_.parent_id&nbsp;as&nbsp;parent2_0_1_,&nbsp;childs1_.parent_id&nbsp;as&nbsp;parent2_0__,&nbsp;childs1_.id&nbsp;as&nbsp;id0__&nbsp;from&nbsp;parent&nbsp;parent0_&nbsp;inner&nbsp;join&nbsp;child&nbsp;childs1_&nbsp;on&nbsp;parent0_.id</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">childs1_.parent_id<br />
list&nbsp;size&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">3</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">===</span><span style="color: rgb(0,0,0)">parent&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;net.foxlog.model.Parent@1401d28[id</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">14</span><span style="color: rgb(0,0,0)">]<br />
</span><span style="color: rgb(0,0,0)">===</span><span style="color: rgb(0,0,0)">parent</span><span style="color: rgb(0,0,0)">'</span><span style="color: rgb(0,0,0)">s&nbsp;child</span><span style="color: rgb(0,0,0)">'</span><span style="color: rgb(0,0,0)">s&nbsp;length&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">===</span><span style="color: rgb(0,0,0)">parent&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;net.foxlog.model.Parent@14e0e90[id</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">15</span><span style="color: rgb(0,0,0)">]<br />
</span><span style="color: rgb(0,0,0)">===</span><span style="color: rgb(0,0,0)">parent</span><span style="color: rgb(0,0,0)">'</span><span style="color: rgb(0,0,0)">s&nbsp;child</span><span style="color: rgb(0,0,0)">'</span><span style="color: rgb(0,0,0)">s&nbsp;length&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">2</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">===</span><span style="color: rgb(0,0,0)">parent&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;net.foxlog.model.Parent@62610b[id</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">17</span><span style="color: rgb(0,0,0)">]<br />
</span><span style="color: rgb(0,0,0)">===</span><span style="color: rgb(0,0,0)">parent</span><span style="color: rgb(0,0,0)">'</span><span style="color: rgb(0,0,0)">s&nbsp;child</span><span style="color: rgb(0,0,0)">'</span><span style="color: rgb(0,0,0)">s&nbsp;length&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">3</span><span style="color: rgb(0,0,0)"><br />
</span></div>
<br />
另外，如果用open session in view模式的话一般不用fetch,但首先推荐fetch,如果非用的话因为有N+1的现象，所以可以结合batch模式来改善下性能.</span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/92644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-01-09 16:48 <a href="http://www.blogjava.net/baoyaer/articles/92644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate二级缓存攻略 </title><link>http://www.blogjava.net/baoyaer/articles/85313.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 04 Dec 2006 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/85313.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/85313.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/85313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/85313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/85313.html</trackback:ping><description><![CDATA[
		<p>hibernate的session提供了一级缓存，每个session，对同一个id进行两次load，不会发送两条sql给数据库，但是session关闭的时候，一级缓存就失效了。<font color="#ff0000">一级缓存不能制定大小，每次调用session.save()是，就把对象纳入一级缓存中，在批量处理时要小心应付</font></p>
		<p>二级缓存是SessionFactory级别的全局缓存，它底下可以使用不同的缓存类库，比如ehcache、oscache等，需要设置，二级缓存可以制定大小<br />，<br />hibernate.cache.provider_class，我们这里用ehcache，在2.1中就是 <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" />
				<span style="COLOR: #000000">hibernate.cache.provider_class</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">net.sf.hibernate.cache.EhCacheProvider <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />如果使用查询缓存，加上 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />hibernate.cache.use_query_cache</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>
				<font color="#ff0000">缓存可以简单的看成一个Map，通过key在缓存里面找value。</font>
		</p>
		<p>
				<b>Class的缓存</b>
				<br />对于一条记录，也就是一个PO来说，是根据ID来找的，缓存的key就是ID，value是POJO。无论list，load还是 iterate，只要读出一个对象，都会填充缓存。但是list不会使用缓存，而iterate会先取数据库select id出来，然后一个id一个id的load，如果在缓存里面有，就从缓存取，没有的话就去数据库load。假设是读写缓存，需要设置： <br />&lt;cache usage="read-write"/&gt; <br />如果你使用的二级缓存实现是ehcache的话，需要配置ehcache.xml <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">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">cache name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">com.xxx.pojo.Foo</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> maxElementsInMemory</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">500</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> eternal</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">false</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> timeToLiveSeconds</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">7200</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> timeToIdleSeconds</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">3600</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> overflowToDisk</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">true</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">/&gt;</span>
				<span style="COLOR: #000000"> <br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>其中eternal表示缓存是不是永远不超时，timeToLiveSeconds是缓存中每个元素（这里也就是一个POJO）的超时时间，如果eternal="false"，超过指定的时间，这个元素就被移走了。timeToIdleSeconds是发呆时间，是可选的。当往缓存里面put 的元素超过500个时，如果overflowToDisk="true"，就会把缓存中的部分数据保存在硬盘上的临时文件里面。 <br />每个需要缓存的class都要这样配置。如果你没有配置，hibernate会在启动的时候警告你，然后使用defaultCache的配置，这样多个class会共享一个配置。 <br />当某个ID通过hibernate修改时，hibernate会知道，于是移除缓存。 <br />这样大家可能会想，同样的查询条件，第一次先list，第二次再iterate，就可以使用到缓存了。实际上这是很难的，因为你无法判断什么时候是第一次，而且每次查询的条件通常是不一样的，假如数据库里面有100条记录，id从1到100，第一次list的时候出了前50个id，第二次 iterate的时候却查询到30至70号id，那么30-50是从缓存里面取的，51到70是从数据库取的，共发送1+20条sql。所以我一直认为 iterate没有什么用，总是会有1+N的问题。 <br />（题外话：有说法说大型查询用list会把整个结果集装入内存，很慢，而iterate只select id比较好，但是大型查询总是要分页查的，谁也不会真的把整个结果集装进来，假如一页20条的话，iterate共需要执行21条语句，list虽然选择若干字段，比iterate第一条select id语句慢一些，但只有一条语句，不装入整个结果集hibernate还会根据数据库方言做优化，比如使用mysql的limit，整体看来应该还是 list快。） <br />如果想要对list或者iterate查询的结果缓存，就要用到查询缓存了</p>
		<p>
				<b>查询缓存</b>
				<br />首先需要配置hibernate.cache.use_query_cache=true <br />如果用ehcache，配置ehcache.xml，注意hibernate3.0以后不是net.sf的包名了 <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" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">cache name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">net.sf.hibernate.cache.StandardQueryCache</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />maxElementsInMemory</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">50</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> eternal</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">false</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> timeToIdleSeconds</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">3600</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />timeToLiveSeconds</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">7200</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> overflowToDisk</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">true</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/&gt;</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">cache name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">net.sf.hibernate.cache.UpdateTimestampsCache</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />maxElementsInMemory</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">5000</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> eternal</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">true</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> overflowToDisk</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">true</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/&gt;</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>然后 <br />query.setCacheable(true);//激活查询缓存 <br />query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion，可选 <br />第二行指定要使用的cacheRegion是myCacheRegion，即你可以给每个查询缓存做一个单独的配置，使用setCacheRegion来做这个指定，需要在ehcache.xml里面配置它： <br />&lt;cache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /&gt; <br />如果省略第二行，不设置cacheRegion的话，那么会使用上面提到的标准查询缓存的配置，也就是net.sf.hibernate.cache.StandardQueryCache</p>
		<p>对于查询缓存来说，缓存的key是根据hql生成的sql，再加上参数，分页等信息（可以通过日志输出看到，不过它的输出不是很可读，最好改一下它的代码）。 <br />比如hql： <br />from Cat c where c.name like ? <br />生成大致如下的sql： <br />select * from cat c where c.name like ? <br />参数是"tiger%"，那么查询缓存的key*大约*是这样的字符串（我是凭记忆写的，并不精确，不过看了也该明白了）： <br />select * from cat c where c.name like ? , parameter:tiger% <br />这样，保证了同样的查询、同样的参数等条件下具有一样的key。 <br />现在说说缓存的value，如果是list方式的话，value在这里并不是整个结果集，而是查询出来的这一串ID。也就是说，不管是list方法还是iterate方法，第一次查询的时候，它们的查询方式很它们平时的方式是一样的，list执行一条sql，iterate执行1+N条，多出来的行为是它们填充了缓存。但是到同样条件第二次查询的时候，就都和iterate的行为一样了，根据缓存的key去缓存里面查到了value，value是一串id，然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。 <br />可以看出来，查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候，都是既填充查询缓存又填充class缓存的。 <br /><b>这里还有一个很容易被忽视的重要问题，即打开查询缓存以后，即使是list方法也可能遇到1+N的问题！</b>相同条件第一次list的时候，因为查询缓存中找不到，不管class缓存是否存在数据，总是发送一条sql语句到数据库获取全部数据，然后填充查询缓存和class缓存。但是第二次执行的时候，问题就来了，如果你的class缓存的超时时间比较短，现在class缓存都超时了，但是查询缓存还在，那么list方法在获取id串以后，将会一个一个去数据库load！因此，class缓存的超时时间一定不能短于查询缓存设置的超时时间！如果还设置了发呆时间的话，保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况，比如class缓存被程序强制evict了，这种情况就请自己注意了。</p>
		<p>另外，如果hql查询包含select字句，那么查询缓存里面的value就是整个结果集了。</p>
		<p>当hibernate更新数据库的时候，它怎么知道更新哪些查询缓存呢？ <br />hibernate在一个地方维护每个表的最后更新时间，其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配置里面。 <br />当通过hibernate更新的时候，hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表，当hibernate查询一个缓存是否存在的时候，如果缓存存在，它还要取出缓存的生成时间和这个缓存所查询的表，然后去查找这些表的最后更新时间，如果有一个表在生成时间后更新过了，那么这个缓存是无效的。 <br />可以看出，只要更新过一个表，那么凡是涉及到这个表的查询缓存就失效了，因此查询缓存的命中率可能会比较低。</p>
		<p>
				<b>Collection缓存</b>
				<br />需要在hbm的collection里面设置 <br />&lt;cache usage="read-write"/&gt; <br />假如class是Cat，collection叫children，那么ehcache里面配置 <br />&lt;cache name="com.xxx.pojo.Cat.children" <br />maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" <br />overflowToDisk="true" /&gt; <br />Collection的缓存和前面查询缓存的list一样，也是只保持一串id，但它不会因为这个表更新过就失效，一个collection缓存仅在这个collection里面的元素有增删时才失效。 <br />这样有一个问题，如果你的collection是根据某个字段排序的，当其中一个元素更新了该字段时，导致顺序改变时，collection缓存里面的顺序没有做更新。</p>
		<p>
				<b>缓存策略</b>
				<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" />
				<span style="COLOR: #000000">只读缓存（read</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">only）：把对象的id，即数据索引纳入缓存，但是不把实体数据纳入缓存，有时可能会导致更大的性能消耗。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />读</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">写缓存（read</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">write）: 把数据索引和对象同时纳入到缓存中<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>不严格的读/写缓存（nonstrict-read-write）：需要更新数据，但是两个事务更新同一条记录的可能性很小，性能比读写缓存好 <br />事务缓存（transactional）：缓存支持事务，发生异常的时候，缓存也能够回滚，只支持jta环境，这个我没有怎么研究过</p>
		<p>读写缓存和不严格读写缓存在实现上的区别在于，读写缓存更新缓存的时候会把缓存里面的数据换成一个锁，其他事务如果去取相应的缓存数据，发现被锁住了，然后就直接取数据库查询。 <br />在hibernate2.1的ehcache实现中，如果锁住部分缓存的事务发生了异常，那么缓存会一直被锁住，直到60秒后超时。 <br />不严格读写缓存不锁定缓存中的数据。</p>
		<p>
				<b>使用二级缓存的前置条件</b>
				<br />你的hibernate程序对数据库有独占的写访问权，其他的进程更新了数据库，hibernate是不可能知道的。你操作数据库必需直接通过 hibernate，如果你调用存储过程，或者自己使用jdbc更新数据库，hibernate也是不知道的。hibernate3.0的大批量更新和删除是不更新二级缓存的，但是据说3.1已经解决了这个问题。 <br />这个限制相当的棘手，有时候hibernate做批量更新、删除很慢，但是你却不能自己写jdbc来优化，很郁闷吧。 <br />SessionFactory也提供了移除缓存的方法，你一定要自己写一些JDBC的话，可以调用这些方法移除缓存，这些方法是： <br />void evict(Class persistentClass) <br />Evict all entries from the second-level cache. <br />void evict(Class persistentClass, Serializable id) <br />Evict an entry from the second-level cache. <br />void evictCollection(String roleName) <br />Evict all entries from the second-level cache. <br />void evictCollection(String roleName, Serializable id) <br />Evict an entry from the second-level cache. <br />void evictQueries() <br />Evict any query result sets cached in the default query cache region. <br />void evictQueries(String cacheRegion) <br />Evict any query result sets cached in the named query cache region. <br />不过我不建议这样做，因为这样很难维护。比如你现在用JDBC批量更新了某个表，有3个查询缓存会用到这个表，用evictQueries (String cacheRegion)移除了3个查询缓存，然后用evict(Class persistentClass)移除了class缓存，看上去好像完整了。不过哪天你添加了一个相关查询缓存，可能会忘记更新这里的移除代码。如果你的 jdbc代码到处都是，在你添加一个查询缓存的时候，还知道其他什么地方也要做相应的改动吗？</p>
		<p>----------------------------------------------------</p>
		<p>
				<b>总结：</b>
				<br />不要想当然的以为缓存一定能提高性能，仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的，不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用，可能会有1+N的问题。不当的使用还可能导致读出脏数据。 <br />如果受不了hibernate的诸多限制，那么还是自己在应用程序的层面上做缓存吧。 <br />在越高的层面上做缓存，效果就会越好。就好像尽管磁盘有缓存，数据库还是要实现自己的缓存，尽管数据库有缓存，咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么，只能做的比较通用，而高层可以有针对性的实现缓存，所以在更高的级别上做缓存，效果也要好些吧。</p>
		<p>终于写完了，好累……</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/85313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-12-04 11:36 <a href="http://www.blogjava.net/baoyaer/articles/85313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>