﻿<?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-bob-文章分类-hibernate</title><link>http://www.blogjava.net/keweibo/category/25071.html</link><description>一专  Java 多能  Delphi,Powerbuilder ... </description><language>zh-cn</language><lastBuildDate>Thu, 14 Jul 2011 14:00:20 GMT</lastBuildDate><pubDate>Thu, 14 Jul 2011 14:00:20 GMT</pubDate><ttl>60</ttl><item><title>struts2+spring+hibernate 懒加载异常：org.hibernate.LazyInitializationException: failed to lazily initialize</title><link>http://www.blogjava.net/keweibo/articles/354252.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Wed, 13 Jul 2011 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/354252.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/354252.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/354252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/354252.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/354252.html</trackback:ping><description><![CDATA[<div>两种处理方法：<br />一、在映射文件中设置lazy=false。<br />二、用OpenSessionInViewFilter过滤器，<strong>注意hibernateFilter过滤器和struts2过滤器在映射时的先后顺序</strong>。同时要配置事物处理，否则会导致session处于只读状态而不能做修改、删除的动作。<br />即在web.xml文件中如下配置：</div><br /><div>&lt;!-- OpenSessionInView --&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&lt;filter&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;</div><img src ="http://www.blogjava.net/keweibo/aggbug/354252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2011-07-13 13:55 <a href="http://www.blogjava.net/keweibo/articles/354252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 数据库Hibernate 保存带有时分秒的日期类型</title><link>http://www.blogjava.net/keweibo/articles/354166.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 12 Jul 2011 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/354166.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/354166.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/354166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/354166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/354166.html</trackback:ping><description><![CDATA[<div>Oracle数据库对应表的Column类型为Date<br />Java类中字段的类型为 java.util.Date<br /><br />&lt;property name="createdDate" <strong>type="timestamp"</strong> &gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="CREATED_DATE" /&gt;<br />&lt;/property&gt;<br /><br />映射文件中property元素的type属性值为 timestamp .</div><img src ="http://www.blogjava.net/keweibo/aggbug/354166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2011-07-12 14:50 <a href="http://www.blogjava.net/keweibo/articles/354166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 映射自身一对多双相关联</title><link>http://www.blogjava.net/keweibo/articles/353875.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Thu, 07 Jul 2011 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/353875.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/353875.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/353875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/353875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/353875.html</trackback:ping><description><![CDATA[<strong style="font-size: 18pt;">映射文件</strong><br style="font-size: 18pt;" /><div><span style="font-size: 10pt;">&lt;hibernate-mapping&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; &lt;class name="org.gecs.hibernate.test.AdDepartment" table="AD_DEPARTMENT" schema="BARCODE"</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dynamic-insert="true" dynamic-update="true"&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="adDepartmentId" type="long"&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="AD_DEPARTMENT_ID" precision="22" scale="0" /&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="sequence"&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;param name="sequence"&gt;AD_DEPARTMENT_SEQ&lt;/param&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="departmentName" type="string"&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="DEPARTMENT_NAME" length="50" not-null="true" /&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="active" type="java.lang.Character" insert="false" update="true"&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ACTIVE" length="1" /&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="createdTime" type="date" insert="false" update="false"&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="CREATED_TIME" length="7" /&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="createdUser" type="string"&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="CREATED_USER" length="20" not-null="true" /&gt;</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</span><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br /><strong style="color: red; font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;many-to-one name="parentDepartment" column="PARENT_DEPARTMENT_ID"/&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;set name="childDepartment" cascade="save-update" lazy="true" inverse="true"&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;key column="PARENT_DEPARTMENT_ID"/&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;one-to-many class="org.gecs.hibernate.test.AdDepartment"/&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/set&gt;</strong><br style="color: red; font-size: 10pt;" /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; &lt;/class&gt;</span><br style="font-size: 10pt;" /><span style="font-size: 10pt;">&lt;/hibernate-mapping&gt;</span><br style="font-size: 10pt;" /><br /><strong><span style="font-size: 18pt;">表结构：</span></strong><br /><div><img src="data:image/png;base64,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" alt="" /></div></div><strong><span style="font-size: 18pt;">测试代码：</span></strong><br /><div><span style="font-size: 10pt;">public void testSave() {</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;AdDepartment department = new AdDepartment();</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;department.setDepartmentName("華南資訊處");</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;department.setCreatedUser("bob");</span><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;AdDepartment child_department = new AdDepartment();</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;child_department.setDepartmentName("PCBA應用系統部");</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;child_department.setCreatedUser("bob");</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;child_department.setParentDepartment(department);</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;department.getChildDepartment().add(child_department);</span><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Transaction tran = session.beginTransaction();</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;session.save(department);</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; //session.save(child_department);</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;tran.commit();</span><br /><span style="font-size: 10pt;">&nbsp;&nbsp; &nbsp;}</span></div><br /><strong><span style="font-size: 18pt;">效果：</span></strong><br /><div><img src="data:image/png;base64,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" alt="" /></div><img src ="http://www.blogjava.net/keweibo/aggbug/353875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2011-07-07 15:35 <a href="http://www.blogjava.net/keweibo/articles/353875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 映射文件配置默认值方法</title><link>http://www.blogjava.net/keweibo/articles/353872.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Thu, 07 Jul 2011 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/353872.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/353872.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/353872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/353872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/353872.html</trackback:ping><description><![CDATA[<div><p>通过设置hibernate映射文件的class处 dynamic-insert="true" dynamic-update="true" 和property 里面的insert="false" update="false" 实现 .<br /></p> <p>两处都要配置！</p>  <p>&lt;property&gt;&lt;/property&gt;标签属性：update=&#8221;true|false&#8221;</p> <p>如果设置为false,则在hibernate的update语句里面没有&lt;property&gt;标签所指明的属性所对应的字段。</p> <p>同理，insert=&#8221;true|false&#8221;</p> <p>如果设置为false,则在hibernate的insert语句里面没有&lt;property&gt;标签所指明的属性所对应的字段。</p> <p>这样的弊端是无法从表单上填写信息了。</p></div><div>&lt;hibernate-mapping&gt;<br />&nbsp;&nbsp;&nbsp; &lt;class name="org.gecs.hibernate.test.AdDepartment" table="AD_DEPARTMENT" schema="BARCODE"<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: red;">dynamic-insert="true" dynamic-update="true"&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="adDepartmentId" type="long"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="AD_DEPARTMENT_ID" precision="22" scale="0" /&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;&nbsp; &nbsp;&lt;param name="sequence"&gt;AD_DEPARTMENT_SEQ&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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="departmentName" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="DEPARTMENT_NAME" length="50" not-null="true" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="active" type="java.lang.Character"<span style="color: red;"> insert="false" update="true"&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ACTIVE" length="1" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="createdTime" type="date" <span style="color: red;">insert="false" update="false"&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="CREATED_TIME" length="7" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="createdUser" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="CREATED_USER" length="20" not-null="true" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br /><br />&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />&lt;/hibernate-mapping&gt;<br /></div><div><strong style="color: red;">注：insert="false"  update="false"　的作用是不对当前字段进行insert和update操作，这样hibernate就不会在未指明默认列的情况下将数据库表中默认值字段清空，但同时也会造成无法对此字段插入或更新非默认值。</strong></div><img src ="http://www.blogjava.net/keweibo/aggbug/353872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2011-07-07 14:55 <a href="http://www.blogjava.net/keweibo/articles/353872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【图】Hibernate Tools-代码生成（转）</title><link>http://www.blogjava.net/keweibo/articles/353861.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Thu, 07 Jul 2011 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/353861.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/353861.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/353861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/353861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/353861.html</trackback:ping><description><![CDATA[<div><div id="cnblogs_post_body"><p><strong><span style="color: red;">转自：</span><span style="color: red;">http://www.cnblogs.com/abllyboy/archive/2010/12/23/1914577.html</span></strong><br /></p><p>建立好数据库后，点击一个键，代码就生成了，这实在是份十分惬意的事情，前面有介绍Hibernate Tools就可以生成代码，那么我们怎么利用它来生成代码呢。</p> <p>下面就把详细步骤贴出来，同样，有图有真相。</p> <p>Step1：安装好Hibernate Tools，建立一个Dynamic web project,笔者工程名为&#8220;HibernateTest&#8221;</p> <p>Step2：笔记以Mysql为示例，所以安装一个Mysql，建立相应测试数据库及表，下图为笔者的数据库及表</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310170478.jpg" alt="" /></p> <p>Step3：将MySql的Jdbc驱动拷贝至lib目录，笔者的为mysql-connector-java-5.1.14-bin.jar，可以去Mysql官网下载</p> <p>Step4：利用Hibernate Tools生成hibernate.cfg.xml文件，如下图：</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310200339.jpg" alt="" height="145" width="586" /></p> <p>点击后可以对hibernate.cfg.xml命令，不管它直接默认转到下一步的配置界面，笔者的配置如下图：</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310245074.jpg" alt="" /></p> <p>点击完成后，它将生成如下xml的配置文件</p> <p>&nbsp;</p> <div> <div id="highlighter_760520"><div><div alt1=""><table><tbody><tr><td><code>1</code></td><td><code>&lt;?xml version=</code><code>"1.0"</code> <code>encoding=</code><code>"UTF-8"</code><code>?&gt;&lt;br&gt;&lt;!DOCTYPE hibernate-configuration PUBLIC&lt;br&gt;&nbsp;&nbsp;&nbsp;&nbsp; </code><code>"-//Hibernate/Hibernate Configuration DTD 3.0//EN"</code><code>&lt;br&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code><code>"<a href="http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd</a>"</code><code>&gt;&lt;br&gt;&lt;hibernate-configuration&gt;&lt;br&gt;&nbsp;&nbsp;&nbsp; &lt;session-factory&gt;&lt;br&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=</code><code>"hibernate.connection.driver_class"</code><code>&gt;com.mysql.jdbc.Driver&lt;/property&gt;&lt;br&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=</code><code>"hibernate.connection.password"</code><code>&gt;</code><code>111</code><code>&lt;/property&gt;&lt;br&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=</code><code>"hibernate.connection.url"</code><code>&gt;jdbc:<a href="mysql://localhost:">mysql://localhost:</a></code><code>3306</code><code>/javadb&lt;/property&gt;&lt;br&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=</code><code>"hibernate.connection.username"</code><code>&gt;root&lt;/property&gt;&lt;br&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=</code><code>"hibernate.dialect"</code><code>&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt;&lt;br&gt;&nbsp;&nbsp;&nbsp;   &lt;/session-factory&gt;&lt;br&gt;&lt;/hibernate-configuration&gt;&lt;br&gt;</code></td></tr></tbody></table></div></div></div> </div> <p>&nbsp;</p> <p>Step5：Hibernate Console 配置</p> <p>a.右键工程，点击Run as-Run Configurations进入如下界面并选择Hibernate Console Configuration：</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310343581.jpg" alt="" /></p> <p>b.新建一个Configure名为HibernateConsole，名字可随个人爱好来命名</p> <p>笔者各标签页配置如下：</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310382123.jpg" alt="" /></p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310382663.jpg" alt="" /></p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310383147.jpg" alt="" /></p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310383631.jpg" alt="" /></p> <p>Step6:利用Hibernat Tools生成reveng.xml</p> <p>a.工程中右键如下图，添加reveng.xml</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311101564.jpg" alt="" /></p> <p>b.没啥说的命个名，选择放置位置</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311110921.jpg" alt="" /></p> <p>c.按照箭头方向进行操作，选择console的配置，再点击刷新，就能看到数据库中的表，将它们Include进来，如下图</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311115895.jpg" alt="" /></p> <p>d:最终效果</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311132939.jpg" alt="" /></p> <p>Step7:这是最后一步了，激动人心的时刻就要到了</p> <p>a.在Eclipse的工具栏中将Hibernate Code Generate显示出来，显示出来后点击Hibernate Code Generate Configurations，如下图:</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310415767.jpg" alt="" /></p> <p>b.Main标签页中选择控制台，选择文件输出路径，包名，reveng.xml文件</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311143172.jpg" alt="" /></p> <p>c.Exporters标签页，选择要生成的文件，记得勾上Hebernate xml Mappings及Hebernate xml Configuration,它们将自动生成映射文件并注册，</p> <p>配置好后，点击Run即可生成代码。</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311155578.jpg" alt="" /></p> <p>&nbsp;</p> <p>大功告成，最后的生成的代码结构如下图：</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311185116.jpg" alt="" /></p> <p>&nbsp;</p> <p>感谢你的阅读，希望本文对你有用！</p></div></div><img src ="http://www.blogjava.net/keweibo/aggbug/353861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2011-07-07 11:54 <a href="http://www.blogjava.net/keweibo/articles/353861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate出现javax.naming.NoInitialContextException 错误的解决办法</title><link>http://www.blogjava.net/keweibo/articles/353676.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 05 Jul 2011 00:12:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/353676.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/353676.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/353676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/353676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/353676.html</trackback:ping><description><![CDATA[异常信息：<br /><div>08:02:56,329&nbsp; WARN SessionFactoryObjectFactory:123 - Could not unbind factory from JNDI<br />javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:&nbsp; java.naming.factory.initial<br />&nbsp;&nbsp; &nbsp;at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)<br />&nbsp;&nbsp; &nbsp;at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)<br />&nbsp;&nbsp; &nbsp;at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)<br />&nbsp;&nbsp; &nbsp;at javax.naming.InitialContext.unbind(InitialContext.java:416)<br />&nbsp;&nbsp; &nbsp;at org.hibernate.impl.SessionFactoryObjectFactory.removeInstance(SessionFactoryObjectFactory.java:116)<br />&nbsp;&nbsp; &nbsp;at org.hibernate.impl.SessionFactoryImpl.close(SessionFactoryImpl.java:806)<br />&nbsp;&nbsp; &nbsp;at org.hibernate.test.junit.UserTest.tearDown(UserTest.java:43)<br />&nbsp;&nbsp; &nbsp;at junit.framework.TestCase.runBare(TestCase.java:130)<br />&nbsp;&nbsp; &nbsp;at junit.framework.TestResult$1.protect(TestResult.java:106)<br />&nbsp;&nbsp; &nbsp;at junit.framework.TestResult.runProtected(TestResult.java:124)<br />&nbsp;&nbsp; &nbsp;at junit.framework.TestResult.run(TestResult.java:109)<br />&nbsp;&nbsp; &nbsp;at junit.framework.TestCase.run(TestCase.java:118)<br />&nbsp;&nbsp; &nbsp;at junit.framework.TestSuite.runTest(TestSuite.java:208)<br />&nbsp;&nbsp; &nbsp;at junit.framework.TestSuite.run(TestSuite.java:203)<br />&nbsp;&nbsp; &nbsp;at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)<br />&nbsp;&nbsp; &nbsp;at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)<br />&nbsp;&nbsp; &nbsp;at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)<br />&nbsp;&nbsp; &nbsp;at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)<br />&nbsp;&nbsp; &nbsp;at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)<br />&nbsp;&nbsp; &nbsp;at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)</div>很奇怪我的项目并没有使用到JNDI，但是却抛出JNDI相关的异常信息。<br />原来是Hibernate的配置文件hibernate.cfg.xml有问题<br /><div>&lt;hibernate-configuration&gt;<br />&nbsp;&nbsp; &nbsp;&lt;session-factory <strong>name="foo"</strong>&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="hibernate.connection.url"&gt;jdbc:oracle:thin:@10.240.144.25:1521:MES&lt;/property&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="hibernate.connection.driver_class"&gt;oracle.jdbc.driver.OracleDriver&lt;/property&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="hibernate.connection.username"&gt;*****&lt;/property&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="hibernate.connection.password"&gt;*****&lt;/property&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="dialect"&gt;org.hibernate.dialect.OracleDialect&lt;/property&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="show_sql"&gt;true&lt;/property&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;mapping resource="org/hibernate/test/User.hbm.xml"/&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&lt;/session-factory&gt;<br />&lt;/hibernate-configuration&gt;</div><br />原因：&lt;seesion-factory&gt;元素多了属性 name.<br /><div><span style="font-family: 宋体;" face="宋体"><span style="font-size: small;" size="3">这样，hibernate会试图把这个sessionfacotry注册到JNDI中去</span></span></div><img src ="http://www.blogjava.net/keweibo/aggbug/353676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2011-07-05 08:12 <a href="http://www.blogjava.net/keweibo/articles/353676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置Middlegen-Hibernate和hibernate-extensions以产生hbm映射文件和POJO(轉)</title><link>http://www.blogjava.net/keweibo/articles/292609.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Wed, 26 Aug 2009 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/292609.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/292609.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/292609.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/292609.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/292609.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"><font size="2">軟體下載相關地址：http://ant.apache.org/bindownload.cgi?Preferred=http%3A%2F%2Fapache.etoak.com</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"><font size="2">http://sourceforge.net/projects/hibernate/files/<br />
</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"><font size="2">先决条件：</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">已经安装了</span><span lang="EN-US">ant</span><span style="font-family: 宋体;">和</span><span lang="EN-US">MySQL</span><span style="font-family: 宋体;">数据库，数据库表已经建立。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"><font size="2"><span lang="EN-US"><span>1、<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp; </span></span></span><span style="font-family: 宋体;">从</span><span lang="EN-US">Hibernate</span><span style="font-family: 宋体;">官方网站下载</span><span lang="EN-US">Middlegen-Hibernate</span><span style="font-family: 宋体;">和</span><span lang="EN-US">hibernate-extensions</span><span style="font-family: 宋体;">，并解压。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"><font size="2"><span lang="EN-US"><span>2、<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp; </span></span></span><span style="font-family: 宋体;">配置</span><span lang="EN-US">Middlegen-Hibernate:</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span lang="EN-US">2.1 </span><span style="font-family: 宋体;">配置数据库连接</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">假设连接的数据库是</span><span lang="EN-US">MySQL</span><span style="font-family: 宋体;">，在</span><span lang="EN-US">Middlegen-Hibernate-r5\config\database</span><span style="font-family: 宋体;">目录中有一个</span><span lang="EN-US">mysql.xml</span><span style="font-family: 宋体;">文件，是用来配置</span><span lang="EN-US">MySQL</span><span style="font-family: 宋体;">数据库的连接的。内容为：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="database.script.file" value="${src.dir}/sql/${name}-mysql.sql"/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="database.driver.file" value="${lib.dir}/<span style="color: red;">mysql-connector-java-3.0.15-ga-bin.jar</span>"/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="database.driver.classpath"<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value="${database.driver.file}"/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="database.driver"<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value="org.gjt.mm.mysql.Driver"/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="database.url"<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value="<span style="color: red;">jdbc:mysql://localhost/jboss</span>"/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="database.userid" <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>value="<span style="color: red;">jboss</span>"/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="database.password"<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value="<span style="color: red;">jboss</span>"/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="database.schema"<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value=""/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="database.catalog"<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value=""/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="jboss.datasource.mapping"<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value="mySQL"/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">将</span><span lang="EN-US">mysql-connector-java-3.0.15-ga-bin.jar</span><span style="font-family: 宋体;">拷贝到</span><span lang="EN-US">${lib.dir}</span><span style="font-family: 宋体;">，也就是</span><span lang="EN-US">Middlegen-Hibernate-r5\lib</span><span style="font-family: 宋体;">目录。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">修改配置文件中的数据库连接项目</span><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US">database.url</span><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; font-family: 宋体;">、</span><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US">database.userid</span><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; font-family: 宋体;">、</span><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US">database.userid</span><span lang="EN-US"> </span><span style="font-family: 宋体;">使</span><span lang="EN-US">Middlegen-Hibernate</span><span style="font-family: 宋体;">可以找到数据库。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span lang="EN-US">2.2 </span><span style="font-family: 宋体;">配置</span><span lang="EN-US">Middlegen-Hibernate-r5</span><span style="font-family: 宋体;">的</span><span lang="EN-US">ant</span><span style="font-family: 宋体;">运行文件</span><span lang="EN-US">build.xml</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2">&lt;!DOCTYPE project [<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp;&nbsp; </span>&lt;!ENTITY database SYSTEM "file:./config/database/<span style="color: red;">mysql.xml</span>"&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2">]&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"><font size="2">指出使用的数据库配置文件。</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2">&lt;project name="Middlegen Hibernate" default="all" basedir="."&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property file="${basedir}/build.properties"/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="name" value="<span style="color: red;">hibernatesample</span>"/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"><font size="2">指出你的应用名称。</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp; </span>&lt;property name="build.gen-src.dir"<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value="<span style="color: red;">C:/sample</span>"/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">指出</span><span lang="EN-US">hbm</span><span style="font-family: 宋体;">的输出路径。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;hibernate<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>destination="${build.gen-src.dir}"<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>package="<span style="color: red;">org.hibernate.sample</span>"<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: red;">genXDocletTags="false"<o:p></o:p></span></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>genIntergratedCompositeKeys="false"<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>/&gt;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">指出</span><span lang="EN-US">hbm</span><span style="font-family: 宋体;">所在的包的位置。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">指出</span><span lang="EN-US">hbm.xml</span><span style="font-family: 宋体;">中是否需要</span><span lang="EN-US">XDoclet Tags</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"><font size="2"><span lang="EN-US"><span>3、<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp; </span></span></span><span style="font-family: 宋体;">运行</span><span lang="EN-US">Middlegen-Hibernate:</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">在</span><span lang="EN-US">Middlegen-Hibernate</span><span style="font-family: 宋体;">目录下运行</span><span lang="EN-US">ant</span><span style="font-family: 宋体;">，进入</span><span lang="EN-US">Middlegen-Hibernate</span><span style="font-family: 宋体;">的图形界面。可以设置表，和字段的特性。然后按</span><span lang="EN-US">Genarate</span><span style="font-family: 宋体;">，产生</span><span lang="EN-US">hbm.xml</span><span style="font-family: 宋体;">文件。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"><font size="2"><span lang="EN-US"><span>4、<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp; </span></span></span><span style="font-family: 宋体;">配置</span><span lang="EN-US">hibernate-extensions</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">在</span><span lang="EN-US">hibernate-extensions-2.1.2\tools\bin</span><span style="font-family: 宋体;">目录有一个</span><span lang="EN-US">setenv.bat</span><span style="font-family: 宋体;">文件，改变其内容为：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2">set JDBC_DRIVER=<span style="color: red;">C:\java\Middlegen-Hibernate-r5\lib\mysql-connector-java-3.0.15-ga-bin.jar</span><o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2">set HIBERNATE_HOME=<span style="color: red;">C:\java\hibernate-2.1.6</span><o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2">set CORELIB=%HIBERNATE_HOME%\lib<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2">set LIB=..\lib<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2">set PROPS=%HIBERNATE_HOME%\src<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;" lang="EN-US"><font size="2">set CP=%JDBC_DRIVER%;%PROPS%;%HIBERNATE_HOME%\hibernate2.jar;%CORELIB%\<span style="color: red;">commons-logging-1.0.4.jar</span>;%CORELIB%\<span style="color: red;">commons-collections-2.1.1.jar</span>;%CORELIB%\<span style="color: red;">commons-lang-1.0.1.jar</span>;%CORELIB%\<span style="color: red;">cglib-full-2.0.2.jar</span>;%CORELIB%\<span style="color: red;">dom4j-1.4.jar;</span>%CORELIB%\<span style="color: red;">odmg-3.0.jar</span>;%CORELIB%\<span style="color: red;">xml-apis.jar</span>;%CORELIB%\<span style="color: red;">xerces-2.4.0.jar</span>;%CORELIB%\<span style="color: red;">xalan-2.4.0.jar</span>;%LIB%\<span style="color: red;">jdom.jar</span>;%LIB%\..\<span style="color: red;">hibernate-tools.jar</span><o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">注意红色字体提示的均是路径和</span><span lang="EN-US">JAR</span><span style="font-family: 宋体;">文件名，一定要正确。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span lang="EN-US">5</span><span style="font-family: 宋体;">、运行</span><span lang="EN-US">hibernate-extensions</span><span style="font-family: 宋体;">，根据</span><span lang="EN-US">hbm.xml</span><span style="font-family: 宋体;">产生</span><span lang="EN-US">POJO</span><span style="font-family: 宋体;">文件</span></font></p>
<font size="2"><span style="font-family: 宋体;">在</span><span lang="EN-US">DOS</span><span style="font-family: 宋体;">中运行</span><span lang="EN-US">hbm2java c:\sample\org\hibernate\sample\*.xml --output=c:\sample\<br />
<br />
轉自：http://www.blogjava.net/relax/archive/2005/03/01/1588.html<br />
<br />
</span></font>
<img src ="http://www.blogjava.net/keweibo/aggbug/292609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2009-08-26 10:50 <a href="http://www.blogjava.net/keweibo/articles/292609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]一个泛型Hibernate DAO实现</title><link>http://www.blogjava.net/keweibo/articles/184372.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Thu, 06 Mar 2008 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/184372.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/184372.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/184372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/184372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/184372.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 文章来源http://blog.csdn.net/dingx/archive/2007/08/06/1728287.aspxpackage&nbsp;sgf4web.dao;import&nbsp;java.io.Serializable;import&nbsp;java.util.*;import&nbsp;java.util.regex.Matcher;i...&nbsp;&nbsp;<a href='http://www.blogjava.net/keweibo/articles/184372.html'>阅读全文</a><img src ="http://www.blogjava.net/keweibo/aggbug/184372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2008-03-06 23:17 <a href="http://www.blogjava.net/keweibo/articles/184372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多对多关联关系的使用</title><link>http://www.blogjava.net/keweibo/articles/171544.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 29 Dec 2007 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/171544.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/171544.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/171544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/171544.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/171544.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;多对多只有双向关系（如果添加一张辅助表来存储多对多的单向关系也可以，但是不值得<br />
这么做，因为多对多的单向关系可以用多对一或者一对多的半向关系来表达，不必要添加一张<br />
辅助表），如学生与课程之间，一个学生对应多个课程，一个课程也可以被多个学生选择。</p>
<p>Student.hbm.xml<br />
...<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="model.Student" table="student"&gt;<br />
&nbsp;&nbsp;&lt;id name="id" unsaved-value="null"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;generator class="uuid.hex"/&gt;<br />
&nbsp;&nbsp;&lt;/id&gt;<br />
&nbsp;&nbsp;&lt;property name="name" type="string"/&gt;<br />
<span style="color: #0000ff"><strong>&nbsp;&nbsp;&lt;set name="courses" <br />
&nbsp;&nbsp;&nbsp;&nbsp;table="student_course"<br />
&nbsp;&nbsp;&nbsp;&nbsp;cascade="save-update"<br />
&nbsp;&nbsp;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;key column="stu_id"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;many-to-many class="model.Course<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column="course_id"/&gt;<br />
&nbsp;&nbsp;&lt;/set&gt;</strong></span><br />
&nbsp;&lt;class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
<span style="color: #ff0000"><strong>多对多关系需要配置的属性比较多一些。初学者经常会把&lt;key column=""/&gt;和&lt;column=""&gt;的值<br />
弄反了，其实只要记住一个原则：&lt;key column=""&gt;总是和本身类的主键id对应，而&lt;column=""&gt;<br />
总是与关联类的主键id相对应。对于上面的Student.hbm.xml,关联类是Course,本身类则是Student</strong></span></p>
<p>Course.hbm.xml<br />
...<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="model.Course" table="course"&gt;<br />
&nbsp;&nbsp;&lt;id name="id" unsaved-value="null"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;generator class="uuid.hex"/&gt;<br />
&nbsp;&nbsp;&lt;/id&gt;<br />
&nbsp;&nbsp;&lt;propery name="name" type="string"/&gt;<br />
<span style="color: #0000ff"><strong>&nbsp;&nbsp;&lt;set name="students"<br />
&nbsp;&nbsp;&nbsp;&nbsp;table="student_course"<br />
&nbsp;&nbsp;&nbsp;&nbsp;cascade="save-update"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;key columm="course_id"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;many-to-many class="model.Student"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column="stu_id"/&gt;<br />
&nbsp;&nbsp;&lt;/set&gt;</strong></span><br />
&nbsp;&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
<span style="color: #ff0000">注意：Student与Course的cascade都设置为save-update，在多对多的关系中，all,delete等<br />
cascade是没有意义的，因为多对多关系中，并不能因为父对象被删除，而造成被包括的子对象<br />
被删除，因为可能还有其他的父对象参考了这个子对象。</span></p>
<p><span style="color: #ff0000"><strong>另外，在多对多关系中，如果双方都有控制权（也就是双方都没有设置inverse="true"），则<br />
双方都要把关联关系反映到数据库。必须在某一方设置inverse="true"，然后在执行语句时使用<br />
主控方进行操作（也就是没有设置inverse="true"的那一方）。</strong></span></p>
<img src ="http://www.blogjava.net/keweibo/aggbug/171544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-12-29 15:01 <a href="http://www.blogjava.net/keweibo/articles/171544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一对多、多对一关联关系的使用</title><link>http://www.blogjava.net/keweibo/articles/171520.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 29 Dec 2007 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/171520.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/171520.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/171520.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/171520.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/171520.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;一对多和多对一关系在实际生活中是非常常见的。在编写程序时，有两种实现的形式<br />
分别是单向关联和双向关联。</p>
<p><span style="font-size: 24pt"><em><u><strong>单向关联</strong></u></em><br />
<br />
<strong><em><u>双向关联</u></em></strong></span></p>
<p>&nbsp;&nbsp;本节中使用到两个类，分别是班级(Team)和学生(Student)，学生和班级之间是多对一<br />
关系。<br />
具体的关联实现源代码如下：<br />
Student.hbm.xml<br />
...<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="model.Student" table="student"&gt;<br />
&nbsp;&nbsp;&lt;id name="id" unsaved-value="null"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;generator class="uuid.hex"/&gt;<br />
&nbsp;&nbsp;&lt;/id&gt;<br />
&nbsp;&nbsp;&lt;property name="name" type="string'/&gt;<br />
<span style="color: #0000ff"><strong>&nbsp;&nbsp;&lt;many-to-one name="team"<br />
&nbsp;&nbsp;&nbsp;&nbsp;class="model.Team"<br />
&nbsp;&nbsp;&nbsp;&nbsp;column="team_id"&nbsp;&lt;!--和team发生关联的列名--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;cascade="none"<br />
&nbsp;&nbsp;&nbsp;&nbsp;fetch="join"<br />
&nbsp;&nbsp;/&gt;</strong></span><br />
&nbsp;&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</p>
<p><span style="color: #ff0000"><strong>&lt;many-to-one&gt;标签具有column属性，column属性总是和关联类（对于Student来说，关联类<br />
是Team）的主键id 相对应，因此Hibernate会根据student表中的team_id，根据Team表中设置<br />
的id列（一般情况列名也叫id），取出team.id=student.team_id的记录，构造成Team对象返<br />
回给Student类。</strong></span></p>
<p>Team.hbm.xml<br />
...<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="model.Team" table="team" lazy="true"&gt;<br />
&nbsp;&nbsp;&lt;id name="id" unsaved-value="null"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;generator class="uuid.hex"/&gt;<br />
&nbsp;&nbsp;&lt;/id&gt;<br />
&nbsp;&nbsp;&lt;property name="teamName" type="string"/&gt;<br />
<strong style="color: #0000ff">&nbsp;&nbsp;&lt;set name="students" cascade="save-update" lazy="true" <span style="color: #ff0000">inverse="true"&gt;</span><br />
&nbsp;&nbsp;&nbsp;&lt;key column="team_id"/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;one-to-many class="model.Student"/&gt;<br />
&nbsp;&nbsp;&lt;/set&gt;</strong><br />
&nbsp;&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</p>
<p><span style="color: #ff0000"><strong>Team对Student是一对多关系，一对多具有&lt;key column=""/&gt;属性，key标签总是和本身类的主键<br />
相对应。在取得Team对象时，通过Team的主键id与Student表中的team_id进行匹配，如果<br />
team.id=student.team_id，则认为此学生是本班级的，于是加载学生，把学生对象加入Team<br />
对象的学生集合。</strong></span></p>
<p>设置inverse标签<br />
&nbsp;&nbsp;由于在Team.hbm.xml中设置了inverse="true",Team和Student之间的关系转由Student来维护<br />
因此，当Team掌握维护权时(inverse="false"或者默认状态），它负责将自己的id告诉Student<br />
，然后Hibernate发送update语句去更新记录。但现在设置了inverse="true"之后，维护权在<br />
Student手中，于是Hibernate不再发送update语句，而由Student自动去取得team_id，而这个<br />
动作其实就是完成一个&#8220;学生添加班级&#8221;动作，也就是语句newStu.setTeam(team)。</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/171520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-12-29 14:32 <a href="http://www.blogjava.net/keweibo/articles/171520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一对一关联关系的使用</title><link>http://www.blogjava.net/keweibo/articles/171510.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 29 Dec 2007 06:00:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/171510.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/171510.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/171510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/171510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/171510.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;一对一关系在实际生活中是比较常见的，如果学生与身份证的关系，学生与档案的关系等等。<br />
&nbsp;&nbsp;一对一关系在Hibernate中的实现有两种方式，分别是<span style="color: red"><strong>主键关联</strong></span>和<span style="color: red"><strong>外键关联</strong></span>。</p>
<p><span style="font-size: 24pt"><em><u>以主键关联<br />
</u></em></span><br />
&nbsp;&nbsp;主键关系的重点是：关联的两个实体共享一个主键值。<br />
Student.hbm.xml<br />
...<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="model.Student" table="student" lazy="true"&gt;&lt;!--把类和表关联起来--&gt;<br />
&nbsp;&nbsp;&lt;id name="id" unsaved-value="null"&gt;&lt;!--id的产生方式是uuid.hex--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;generator class="uuid.hex"/&gt;<br />
&nbsp;&nbsp;&lt;/id&gt;<br />
&nbsp;&nbsp;&lt;property name="name" type="sring"/&gt;<br />
&nbsp;&nbsp;&lt;one-to-one name="cer"<br />
&nbsp;&nbsp;&nbsp;&nbsp;class="model.Certificate"<br />
&nbsp;&nbsp;&nbsp;&nbsp;fetch="join"<br />
&nbsp;&nbsp;&nbsp;&nbsp;cascade="all"<br />
&nbsp;&nbsp;/&gt;&lt;!--映射对应的身份证对象--&gt;<br />
&nbsp;&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</p>
<p>Certificate.hbm.xml<br />
...<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="model.Certificate" table="certificate" lazy="true"&gt;<br />
&nbsp;&nbsp;&lt;id name="id"&gt;<br />
&nbsp;&nbsp;&lt;!--外键生成机制，引用stu对象的主键作为certificate数据表的主键和外键--&gt;<br />
<span style="color: #0000ff"><strong>&nbsp;&nbsp;&nbsp;&lt;generator class="foreign"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="property"&gt;stu&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/generator&gt;</strong></span><br />
&nbsp;&nbsp;&lt;/id&gt;<br />
&nbsp;&nbsp;&lt;one-to-one name="stu"<br />
&nbsp;&nbsp;&nbsp;&nbsp;class="model.Student"<br />
&nbsp;&nbsp;&nbsp;&nbsp;constrained="true"&nbsp;&lt;!--表示Certificate引用了stu的主键作为外键--&gt;<br />
&nbsp;&nbsp;/&gt;<br />
&nbsp;&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</p>
<p>上述的两个配置文件在&lt;one-to-one&gt;标签中都没有设置column属性<br />
（实际上&lt;one-to-one&gt;标签本身就没有column属性）。<br />
</p>
<p><span style="font-size: 24pt"><br />
<u><em>以外键关联</em></u><br />
</span><br />
&nbsp;&nbsp;以外键关联的重点是：两个实体各自有不同的主键，但其中一个实体有一个外键引用<br />
了另一个表的主键。</p>
<p>Student.hbm.xml<br />
...<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="model.Student" table="student" lazy="true"&gt;<br />
&nbsp;&nbsp;&lt;id name="id" nusaved-value="null"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;generator class="uuid.hex"/&gt;<br />
&nbsp;&nbsp;&lt;/id&gt;<br />
&nbsp;&nbsp;&lt;property name="name" type="sring"/&gt;<br />
&nbsp;&nbsp;&lt;one-to-one name="cer"<br />
&nbsp;&nbsp;&nbsp;&nbsp;class="model.Certificate"<br />
&nbsp;&nbsp;&nbsp;&nbsp;fetch="join"<br />
&nbsp;&nbsp;&nbsp;&nbsp;cascade="all"<br />
&nbsp;&nbsp;/&gt;&lt;!--映射对应的身份证对象--&gt;<br />
&nbsp;&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
可以看到Student.hbm.xml和以主键关联时的代码是一样的，并没有改变。</p>
<p>Certificate.hbm.xml<br />
...<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="model.Certificate" table="certificate" lazy="true"&gt;<br />
&nbsp;&nbsp;&lt;id name="id"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;generator class="uuid.hex"/&gt;&nbsp;&lt;!--不再是foreign了--&gt;<br />
&nbsp;&nbsp;&lt;/id&gt;<br />
<span style="color: #0000ff"><strong>&nbsp;&nbsp;&lt;many-to-one name="stu"<br />
&nbsp;&nbsp;&nbsp;&nbsp;class="model.Student"<br />
&nbsp;&nbsp;&nbsp;&nbsp;unique="true"&nbsp;&lt;!--唯一的多对一，其实也就变成了一对一关系--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;column="stu_id"&nbsp;<br />
&nbsp;&nbsp;/&gt;</strong></span><br />
&nbsp;&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
以外键关联的一对一，其实本质上变成了一对多的双向关联了，编写时直接<br />
按照一对多和多对一的要求编写，最后在many-to-one这一边上加上一个<br />
unique="true"即可。</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/171510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-12-29 14:00 <a href="http://www.blogjava.net/keweibo/articles/171510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3的DetachedCriteria支持(转)</title><link>http://www.blogjava.net/keweibo/articles/165427.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Wed, 05 Dec 2007 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/165427.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/165427.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/165427.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/165427.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/165427.html</trackback:ping><description><![CDATA[<span>2005-07-12 09:55 </span><span>作者： robbin </span><span>出处： http://dev.yesky.com/241/2033241.shtml<br />
<br />
Hibernate3支持DetachedCriteria，这是一个非常有意义的特性！我们知道，在常规的Web编程中，有大量的动态条件查询，即用户在<a class="bluekey" href="http://homepage.yesky.com/" target="_blank">网页</a>上面自由选择某些条件，<a class="bluekey" href="http://dev.yesky.com/" target="_blank">程序</a>根据用户的选择条件，动态生成SQL语句，进行查询。 <br />
<br />
　　针对这种需求，对于分层应用程序来说，Web层需要传递一个查询的条件列表给业务层对象，业务层对象获得这个条件列表之后，然后依次取出条件，构造查询语句。这里的一个难点是条件列表用什么来构造？传统上使用Map，但是这种方式缺陷很大，Map可以传递的信息非常有限，只能传递name和value，无法传递究竟要做怎样的条件运算，究竟是大于，小于，like，还是其它的什么，业务层对象必须确切掌握每条entry的隐含条件。因此一旦隐含条件改变，业务层对象的查询构造算法必须相应修改，但是这种查询条件的改变是隐式约定的，而不是程序代码约束的，因此非常容易出错。 <br />
<br />
　　DetachedCriteria可以解决这个问题，即在web层，程序员使用DetachedCriteria来构造查询条件，然后将这个DetachedCriteria作为方法调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后，可以在session范围内直接构造Criteria，进行查询。就此，查询语句的构造完全被搬离到web层实现，而业务层则只负责完成持久化和查询的封装即可，与查询条件构造完全解耦，非常完美！这恐怕也是以前很多企图在web层代码中构造HQL语句的人想实现的梦想吧！ <br />
<br />
　　示例代码片段如下： <br />
<br />
　　web层程序构造查询条件： <br />
<br />
　　<a class="bluekey" href="http://dev.yesky.com/devjava/" target="_blank">java</a>代码: <br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    <tbody>
        <tr>
            <td>DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); <br />
            detachedCriteria.add(Restrictions.eq("name", "department")).createAlias("employees", "e").add(Restrictions.gt(("e.age"), new Integer(20)));</td>
        </tr>
    </tbody>
</table>
<br />
　　Department和Employee是一对多关联，查询条件为： <br />
<br />
　　名称是&#8220;department&#8221;开发部门； <br />
　　部门里面的雇员年龄大于20岁； <br />
<br />
　　业务层对象使用该条件执行查询： <br />
<br />
　　java代码: <br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    <tbody>
        <tr>
            <td>detachedCriteria.getExecutableCriteria(session).list();</td>
        </tr>
    </tbody>
</table>
<br />
　　最大的意义在于，业务层代码是固定不变的，所有查询条件的构造都在web层完成，业务层只负责在session内执行之。这样代码就可放之四海而皆准，都无须修改了。<br />
<br />
　　然而Spring和Hibernate3的DetachedCriteria有不兼容的问题，因此在Spring环境下面使用Hibernate3需要注意： <br />
<br />
　　Spring的HibernateTemplate提供了Hibernate的完美封装，即通过匿名类实现回调，来保证Session的自动资源管理和事务的管理。其中核心方法是： <br />
<br />
　　java代码: <br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    <tbody>
        <tr>
            <td>HibernateTemplate.execute(new HibernateCallback() { <br />
            　public Object doInHibernate(Session session) throws HibernateException { <br />
            　　.... <br />
            　} <br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　回调方法提供了session作为参数，有了session，就可以自由的使用Hibernate API编程了。使用了spring的之后，代码修改如下： <br />
<strong><br />
</strong>　　web层代码： <br />
<br />
　　java代码: <br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    <tbody>
        <tr>
            <td>DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); <br />
            detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20))); <br />
            departmentManager.findByCriteria(detachedCriteria);</td>
        </tr>
    </tbody>
</table>
<br />
　　构造detachedCriteria，作为参数传递给departmentManager <br />
<br />
　　业务层代码使用spring，DepartmentManager的findByCriteria如下： <br />
<br />
　　java代码: <br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    <tbody>
        <tr>
            <td>public List findByCriteria(final DetachedCriteria detachedCriteria) { <br />
            　return (List) getHibernateTemplate().execute(new HibernateCallback() { <br />
            　　public Object doInHibernate(Session session) throws HibernateException { <br />
            　　　Criteria criteria = detachedCriteria.getExecutableCriteria(session); <br />
            　　　return criteria.list(); <br />
            　　} <br />
            　}); <br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　实际上也就是： <br />
<br />
　　java代码: <br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    <tbody>
        <tr>
            <td>Criteria criteria = detachedCriteria.getExecutableCriteria(session); <br />
            return criteria.list(); </td>
        </tr>
    </tbody>
</table>
<br />
　　而已 <br />
<br />
　　但是该程序代码执行，会抛出强制类型转换异常！ <br />
<br />
　　我跟踪了一下spring和Hibernate源代码，原因如下： <br />
<br />
　　spring的HibernateTemplate的execute方法提供的回调接口具有Session作为参数，但是实际上，默认情况下，HibernateTemplate传递给回调接口的session并不是org.hibernate.impl.SessionImpl类，而是SessionImpl类的一个Proxy类。之所以替换成为一个Proxy类，HibernateTemplate的注释说明，Proxy提供了一些额外的功能，包括自动设置Cachable，Transaction的超时时间，Session资源的更积极的关闭等等。 <br />
<br />
　　java代码: <br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    <tbody>
        <tr>
            <td>private boolean exposeNativeSession = false; <br />
            ... </td>
        </tr>
    </tbody>
</table>
<br />
　　execute方法内部： <br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    <tbody>
        <tr>
            <td>Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));</td>
        </tr>
    </tbody>
</table>
<br />
　　但是遗憾的是，Hibernate的DetachedCriteria的setExecutableCriteria方法却要求将session参数强制转为SessionImpl，但是spring传过来的却是一个Proxy类，因此就报错了。 <br />
<br />
　　java代码: <br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    <tbody>
        <tr>
            <td>public Criteria getExecutableCriteria(Session session) { <br />
            　impl.setSession( (SessionImpl) session ); // 要求SessionImpl，Spring传递的是Proxy <br />
            　return impl; <br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　解决方法，禁止Spring的HibernateTemplate传递Proxy类，强制要求它传递真实的SessionImpl类，即给exexute方法增加一个参数，提供参数为true，如下： <br />
<br />
　　java代码: <br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    <tbody>
        <tr>
            <td>public List findByCriteria(final DetachedCriteria detachedCriteria) { <br />
            　return (List) getHibernateTemplate().execute(new HibernateCallback() { <br />
            　　public Object doInHibernate(Session session) throws HibernateException { <br />
            　　　Criteria criteria = detachedCriteria.getExecutableCriteria(session); <br />
            　　　return criteria.list(); <br />
            　　} <br />
            　}, true); <br />
            }</td>
        </tr>
    </tbody>
</table>
</span>
 <img src ="http://www.blogjava.net/keweibo/aggbug/165427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-12-05 11:10 <a href="http://www.blogjava.net/keweibo/articles/165427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批量抓取</title><link>http://www.blogjava.net/keweibo/articles/158584.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 06 Nov 2007 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/158584.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/158584.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/158584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/158584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/158584.html</trackback:ping><description><![CDATA[<p>Hibernate可以充分有效的使用批量抓取（<span style="color: #0000ff">批量立即加载</span>和<span style="color: #0000ff">批量延迟加载</span>），也就是说，如果仅一个访问代理（或集合），那么Hibernate将不载入其他未实例化的代理。 批量抓取是延迟查询抓取的优化方案，你可以在两种批量抓取方案之间进行选择：在类级别和集合级别。 </p>
<p>一对多、多对多（末端为多）的情况：在集合的配置中设置，以 set 为例，如下所示：&nbsp;</p>
<pre class="programlisting">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set name="students" inverse="true" cascade="all" lazy="false" <span style="color: #0000ff">batch-size="2"</span> &gt;&lt;!-- 一对多的延迟加载设置 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="TEAMID" length="32" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/key&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many class="edu.dgut.ke.model.Student" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;</pre>
<p>&nbsp;一对一、多对一（末端为一）的情况：如果要对末端为一的关联设置批量加载，要在&#8220;一&#8221;这端的配置文件中进行设置，比如学生对身份证，要实现对班级的批量加载，应设置如下<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class name="edu.dgut.ke.model.Certificate" table="CERTIFICATE" lazy="true" <span style="color: #0000ff">batch-size="10" </span>&gt;<br />
<br />
<strong><em><u>测试例子</u></em></strong><br />
</p>
Session session = HibernateSessionFactory.getSession();<br />
&nbsp;&nbsp;List list = session.createQuery("from Student").list();<br />
&nbsp;&nbsp;HibernateSessionFactory.closeSession();<br />
（Student对Certificate是采用立即加载策略）<br />
<strong><em><u>控制台输出</u></em></strong><br />
<br />
Hibernate: select student0_.ID as ID0_, student0_.cardId as cardId0_, student0_.TEAMID as TEAMID0_, student0_.STUDENTNAME as STUDENTN4_0_ from STUDENT student0_<br />
Hibernate: select certificat0_.ID as ID1_0_, certificat0_.`DESCRIBE` as DESCRIBE2_1_0_ from CERTIFICATE certificat0_ where certificat0_.ID <span style="color: #0000ff">in (?, ?, ?, ?, ?, ?)</span><br />
<img src ="http://www.blogjava.net/keweibo/aggbug/158584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-11-06 16:19 <a href="http://www.blogjava.net/keweibo/articles/158584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>外连接与预先抓取的区别(摘抄于hibernate开发及整合应用大全) </title><link>http://www.blogjava.net/keweibo/articles/158559.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 06 Nov 2007 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/158559.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/158559.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/158559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/158559.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/158559.html</trackback:ping><description><![CDATA[<p>假设有一个类A,它有两个属性property1和property2,则HQL语句"<span style="color: #0000ff"><strong>from A as a left outer join a.property1</strong></span>"有一个原则--<span style="color: red"><strong><em><u style="color: #0000ff">HQL语句忽略配置文件的预先抓取策略</u></em></strong></span>,这句话有两个意思:</p>
<p>1.不管A类对property1在配置文件里是什么策略(可能是预先抓取,立即或延迟检索,它们都失效),这时都采用HQL指定的左外连接;<span style="color: #0000ff"><strong>左外连接必定会初始化property1属性(或对象),</strong></span>但是如果配置文件里对property1的检索策略是延迟加载,A类得 到对properyt1的引用,为了得到这个引用,需要再次发送一条SQL语句来确立这种引用关系,这种情况在property1为集合时经常出现.</p>
<p>2.A类在配置文件中设置的<span style="color: #0000ff"><strong>对property2的预先抓取策略将被忽略</strong></span>(不管这个策略是fetch或是select),<span style="color: #0000ff"><strong>对property2有影响的设置是立即和延迟加载</strong></span>,hibernate只看得到这两种策略,所以在使用语句"from A as a left outer join a.property1"时,<span style="color: #0000ff"><strong>property2的加载策略将仅由lazy="true"或者是lazy="false"来决定&nbsp;<br />
</strong></span><br />
<img height="116" alt="" src="http://www.blogjava.net/images/blogjava_net/keweibo/page2.jpg" width="605" border="0" /><br />
Team.hbm.xml&nbsp;<br />
...&nbsp;&nbsp;&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set name="students" inverse="true" cascade="all" lazy="true" fetch="join"&gt;&lt;!-- 一对多的延迟加载设置 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="TEAMID" length="32" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/key&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many class="edu.dgut.ke.model.Student" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;<br />
...&nbsp;&nbsp;&nbsp;&nbsp;...<br />
Student.hbm.xml<br />
...&nbsp;&nbsp;&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name="certificate" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;class="edu.dgut.ke.model.Certificate"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;unique="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;column="cardId"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;cascade="all"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;lazy="false"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;fetch="join"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name="team" class="edu.dgut.ke.model.Team" fetch="join"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="TEAMID" length="32" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;<br />
...&nbsp;&nbsp;&nbsp;&nbsp;...<br />
<em><strong><u>测试代码</u></strong></em><br />
&nbsp;&nbsp;Session session = HibernateSessionFactory.getSession();<br />
&nbsp;&nbsp;List list = session.createQuery("from Student as s left join s.team").list();<br />
&nbsp;&nbsp;HibernateSessionFactory.closeSession();<br />
&nbsp;&nbsp;//list 包括两个长度为2的数组,每一个数组中包括一个学生对象和一个班级对象<br />
&nbsp;&nbsp;Object[] stuAndTeam1 = (Object[]) list.get(0);<br />
&nbsp;&nbsp;Student stu = (Student) stuAndTeam1[0];<br />
&nbsp;&nbsp;System.out.println(stu.getStudentname());<br />
&nbsp;&nbsp;System.out.println(stu.getTeam().getTeamname());<br />
&nbsp;&nbsp;System.out.println(stu.getTeam().getStudents().size());</p>
<strong><em><u>控制台输出</u></em></strong><br />
Hibernate: select student0_.ID as ID0_0_, team1_.ID as ID2_1_, student0_.cardId as cardId0_0_, student0_.TEAMID as TEAMID0_0_, student0_.STUDENTNAME as STUDENTN4_0_0_, team1_.TEAMNAME as TEAMNAME2_1_ from STUDENT student0_ left outer join TEAM team1_ on student0_.TEAMID=team1_.ID<br />
Hibernate: select certificat0_.ID as ID1_0_, certificat0_.`DESCRIBE` as DESCRIBE2_1_0_ from CERTIFICATE certificat0_ where certificat0_.ID=?<br />
Hibernate: select certificat0_.ID as ID1_0_, certificat0_.`DESCRIBE` as DESCRIBE2_1_0_ from CERTIFICATE certificat0_ where certificat0_.ID=?<br />
张三<br />
05计算机应用技术(1)班<br />
<span style="color: #ff00ff">Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: edu.dgut.ke.model.Team.students, no session or session was closed<br />
</span>&nbsp;at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)<br />
&nbsp;at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)<br />
&nbsp;at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:97)<br />
&nbsp;at org.hibernate.collection.PersistentSet.size(PersistentSet.java:114)<br />
&nbsp;at edu.dgut.ke.test.chapter3.Query.main(Query.java:44)<br />
<img height="350" alt="" src="http://www.blogjava.net/images/blogjava_net/keweibo/QQ.jpg" width="555" border="0" /><br />
<br />
<span style="color: red"><strong>注意</strong></span>：在配置文件中设置的检索策略只能影响到session.get()或者session.load()方法，对于直接使用<br />
session.createQuery("from Student as s left join s.team")这种指明HQL的方式，将忽略配置文件的预先抓取检索策略（学生对班级的预先检索策略被忽略），这语句指明了学生和班级之间使用左外连接策略，因此控制台输出的第一条语句，即使用了左外连接得到了3个对象：2个学生和1个班级。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;得到了学生对象之后，学生以身份证的预先抓取策略失效，所以会有第二条和第三条语句，即使用了立即加载<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;得到班级对象后，由于班级对学生采用延迟加载（这个策略不会被忽略），于是班级的学生集合并未得到初始化，所以当输出学生的人数，就抛出了例外。
<img src ="http://www.blogjava.net/keweibo/aggbug/158559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-11-06 15:08 <a href="http://www.blogjava.net/keweibo/articles/158559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate配置属性 （hibernate.max_fetch_depth）</title><link>http://www.blogjava.net/keweibo/articles/158537.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 06 Nov 2007 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/158537.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/158537.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/158537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/158537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/158537.html</trackback:ping><description><![CDATA[&nbsp;Hibernate配置属性
<table summary="Hibernate配置属性" border="1">
    <colgroup>
    <col>
    <col></colgroup>
    <thead>
        <tr>
            <th>属性名</th>
            <th>用途</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal">hibernate.dialect</tt></td>
            <td><span class="emphasis"><em>Hibernate<tt class="literal">方言（Dialect）</tt>的类名 - 可以让Hibernate使用某些特定的数据库平台的特性</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">full.classname.of.Dialect</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.default_schema</tt></td>
            <td><span class="emphasis"><em>在生成的SQL中，scheml/tablespace的全限定名</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">SCHEMA_NAME</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.session_factory_name</tt></td>
            <td><span class="emphasis"><em>把<tt class="literal">SessionFactory</tt>绑定到JNDI中去.</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">jndi/composite/name</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.use_outer_join</tt></td>
            <td><span class="emphasis"><em>允许使用外连接抓取.</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">true</tt> | <tt class="literal">false</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal" style="color: #0000ff">hibernate.max_fetch_depth</tt></td>
            <td style="color: #0000ff"><span class="emphasis"><em>设置外连接抓取树的最大深度</em></span>
            <p><span class="strong">取值.</span> 建议设置为<tt class="literal">0</tt>到<tt class="literal">3</tt>之间 </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jdbc.fetch_size</tt></td>
            <td><span class="emphasis"><em>一个非零值，用来决定JDBC的获取量大小。(会调用calls <tt class="literal">Statement.setFetchSize()</tt>).</em></span></td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jdbc.batch_size</tt></td>
            <td><span class="emphasis"><em>一个非零值，会开启Hibernate使用JDBC2的批量更新功能</em></span>
            <p><span class="strong">取值.</span> 建议值在 <tt class="literal">5</tt> 和 <tt class="literal">30</tt>之间。 </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jdbc.use_scrollable_resultset</tt></td>
            <td><span class="emphasis"><em>允许Hibernate使用JDBC2提供的可滚动结果集。只有在使用用户自行提供的连接时，这个参数才是必需的。否则Hibernate会使用连接的元数据(metadata)。</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">true</tt> | <tt class="literal">false</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jdbc.use_streams_for_binary</tt></td>
            <td><span class="emphasis"><em>在从JDBC读写<tt class="literal">binary（二进制）</tt>或者<tt class="literal">serializable（可序列化）</tt>类型时,是否使用stream(流）</em></span>. 这是一个系统级别的属性。
            <p><span class="strong">取值.</span> <tt class="literal">true</tt> | <tt class="literal">false</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.cglib.use_reflection_optimizer</tt></td>
            <td><span class="emphasis"><em>是否使用CGLIB来代替运行时反射操作。（系统级别属性，默认为在可能时都使用CGLIB）.在调试的时候有时候使用反射会有用。</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">true</tt> | <tt class="literal">false</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jndi.<span class="emphasis"><em>&lt;propertyName&gt;</em></span></tt></td>
            <td><span class="emphasis"><em>把<tt class="literal">propertyName</tt>这个属性传递到JNDI <tt class="literal">InitialContextFactory</tt>去</em></span> (可选) </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.isolation</tt></td>
            <td><span class="emphasis"><em>事务隔离级别</em></span> (可选)
            <p><span class="strong">取值.</span> <tt class="literal">1, 2, 4, 8</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.<span class="emphasis"><em>&lt;propertyName&gt;</em></span></tt></td>
            <td><span class="emphasis"><em>把 <tt class="literal">propertyName</tt>这个JDBC 属性传递到<tt class="literal">DriverManager.getConnection()</tt>去</em></span>. </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.provider_class</tt></td>
            <td><span class="emphasis"><em>指定一个自定义的<tt class="literal">ConnectionProvider</tt>类名</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">classname.of.ConnectionProvider</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.cache.provider_class</tt></td>
            <td><span class="emphasis"><em>指定一个自定义的<tt class="literal">CacheProvider</tt>缓存提供者的类名</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">classname.of.CacheProvider</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.transaction.factory_class</tt></td>
            <td><span class="emphasis"><em>指定一个自定义的<tt class="literal">TransactionFactory</tt>类名，Hibernate Transaction API将会使用.</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">classname.of.TransactionFactory</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">jta.UserTransaction</tt></td>
            <td><span class="emphasis"><em><tt class="literal">JTATransactionFactory</tt> 用来获取JTA <tt class="literal">UserTransaction</tt>的JNDI名.</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">jndi/composite/name</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.transaction.manager_lookup_class</tt></td>
            <td><span class="emphasis"><em><tt class="literal">TransactionManagerLookup</tt>的类名 - 当在JTA环境中，JVM级别的缓存被打开的时候使用.</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">classname.of.TransactionManagerLookup</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.query.substitutions</tt></td>
            <td><span class="emphasis"><em>把Hibernate查询中的一些短语映射为SQL短语。（比如说短语可能是函数或者字符） .</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.show_sql</tt></td>
            <td><span class="emphasis"><em>把所有的SQL语句都输出到控制台(可以作为log功能的一个替代).</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">true</tt> | <tt class="literal">false</tt> </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.hbm2ddl.auto</tt></td>
            <td><span class="emphasis"><em>自动输出schema创建DDL语句.</em></span>
            <p><span class="strong">取值.</span> <tt class="literal">update</tt> | <tt class="literal">create</tt> | <tt class="literal">create-drop</tt> </p>
            </td>
        </tr>
    </tbody>
</table>
<tt class="literal" style="color: #0000ff">hibernate.max_fetch_depth</tt><span style="color: #0000ff">=0时，表示不允许外连接，这时的预先抓取策略就算设置了也是失效的，取而代之的是立即加载策略。</span>
<img src ="http://www.blogjava.net/keweibo/aggbug/158537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-11-06 14:04 <a href="http://www.blogjava.net/keweibo/articles/158537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Hibernate.initialize(Object obj)方法初始化一个代理对象或者集合</title><link>http://www.blogjava.net/keweibo/articles/157978.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 03 Nov 2007 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/157978.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/157978.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/157978.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/157978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/157978.html</trackback:ping><description><![CDATA[<p>.............</p>
<p>public class Query {</p>
<p><br />
&nbsp;public static void main(String[] args) {<br />
<br />
&nbsp;&nbsp;//打开Session取得Student对象,后关闭Session<br />
&nbsp;&nbsp;Student student = getStudent();<br />
&nbsp;&nbsp;//打开另一个Session.调用update()方法,因为在上面的Session关闭后,<br />
&nbsp;&nbsp;//student对象成了脱管状态,在另一个Session中无法初始化一个脱管对象,必须重新关联<br />
&nbsp;&nbsp;HibernateSessionFactory.getSession().update(student.getTeam());<br />
&nbsp;&nbsp;//使用initialize方法初始化一个代理对象或者集合(此代理并不能保证内部嵌套的对象或者集合被初始化)<br />
&nbsp;&nbsp;Hibernate.initialize(student.getTeam());<br />
&nbsp;&nbsp;System.out.println(student.getTeam().getTeamname());<br />
&nbsp;&nbsp;HibernateSessionFactory.closeSession();<br />
&nbsp;}</p>
<p>...&nbsp;<br />
&nbsp;public static Student getStudent() {<br />
&nbsp;&nbsp;StudentDAO studentDAO = new StudentDAO();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Session session = studentDAO.getSession();<br />
&nbsp;&nbsp;Student student = (Student) session.get(Student.class, "2c9ab2d516056609011605660e7e0001");<br />
&nbsp;&nbsp;session.close();<br />
&nbsp;&nbsp;return student;<br />
&nbsp;}<br />
...&nbsp;<br />
}<br />
</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/157978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-11-03 22:17 <a href="http://www.blogjava.net/keweibo/articles/157978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate延迟加载</title><link>http://www.blogjava.net/keweibo/articles/157970.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 03 Nov 2007 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/157970.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/157970.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/157970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/157970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/157970.html</trackback:ping><description><![CDATA[示例数据表：team(班级)、certificate(身份证)、student(学生)<br />
<img style="width: 344px; height: 518px" height="518" alt="" src="http://www.blogjava.net/images/blogjava_net/keweibo/mysql.jpg" width="344" border="0" /><br />
<span style="color: red"><strong><em><u style="color: #0000ff">Team.hbm.xml</u></em></strong></span><br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp;&nbsp;&nbsp; Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;class name="edu.dgut.ke.model.Team" table="TEAM"&nbsp;<span style="color: #ff9900">&nbsp;<strong>lazy&nbsp;="true"</strong></span>&nbsp; &gt;&lt;!-- 多对一的延迟加载设置 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ID" length="32" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="uuid.hex" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="teamname" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="TEAMNAME" length="32" not-null="true" unique="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set name="students" inverse="true" cascade="all" <span style="color: #00ccff"><strong>lazy="true" </strong></span>&gt;&nbsp; &lt;!--&nbsp;一对多的延迟加载设置&nbsp;--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="TEAMID" length="32" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/key&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many class="edu.dgut.ke.model.Student" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
<br />
<span style="color: #0000ff"><u><em><strong>Certificate.hbm.xml</strong></em></u></span><br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp;&nbsp;&nbsp; Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;class name="edu.dgut.ke.model.Certificate" table="CERTIFICATE"<strong> <span style="color: #ff00ff">lazy="true"</span></strong>&nbsp; &gt;&lt;!--&nbsp;一对一的延迟加载设置&nbsp;--&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ID" length="32" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="uuid"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="describe" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="`DESCRIBE`" length="50" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-one name="student"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;class="edu.dgut.ke.model.Student"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff00ff"><strong>constrained="true"</strong></span>&nbsp; &gt;&lt;!--&nbsp;一对一的延迟加载设置&nbsp;--&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/one-to-one&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
<br />
<span style="color: #0000ff"><strong><em><u>Student.hbm.xml</u></em></strong></span><br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp;&nbsp;&nbsp; Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;class name="edu.dgut.ke.model.Student" table="STUDENT" <span style="color: #ff00ff"><span style="color: #000000">lazy="true"&nbsp;</span></span> &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ID" length="32" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="uuid.hex" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name="certificate" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;class="edu.dgut.ke.model.Certificate"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;unique="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;column="cardId"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;cascade="all"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name="team" class="edu.dgut.ke.model.Team"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="TEAMID" length="32" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="studentname" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="STUDENTNAME" length="16" not-null="true" unique="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
<span style="color: #ff0000"><strong>注意：对one-to-one 关系进行延迟加载和其他关系相比稍微有些不同。many-to-one 的延迟加载是在配置文件的class 标签<br />
上设置 lazy="true" ，one-to-many 和 many-to-many 的延迟加载是在 set 标签中设置lazy="true"。而one-to-one 不只要在 classs <br />
标签设置 lazy="true"，而且要在one-to-one 标签中设置constrained="true" 。<br />
如果不设置constrained="true"，则一对一查询使用默认的预先抓取策略(fetch="join")。</strong></span><br />
<br />
<img src ="http://www.blogjava.net/keweibo/aggbug/157970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-11-03 21:13 <a href="http://www.blogjava.net/keweibo/articles/157970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改脱管(Detached)对象</title><link>http://www.blogjava.net/keweibo/articles/156713.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 29 Oct 2007 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/156713.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/156713.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/156713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/156713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/156713.html</trackback:ping><description><![CDATA[<div></div>
<p>很多程序需要在某个事务中获取对象，然后将对象发送到界面层去操作，最后在一个新的事务保存所做的修改。 在高并发访问的环境中使用这种方式，通常使用附带版本信息的数据来保证这些&#8220;长&#8220;工作单元之间的隔离。 </p>
<p>Hibernate通过提供使用<tt class="literal" style="color: #0000ff"><strong>Session.update()</strong></tt>或<tt class="literal" style="color: #0000ff"><strong>Session.merge()</strong></tt>方法 重新关联脱管实例的办法来支持这种模型。 </p>
<pre class="programlisting">// in the first session
Cat cat = (Cat) firstSession.load(Cat.class, catId);
Cat potentialMate = new Cat();
firstSession.save(potentialMate);
// in a higher layer of the application
cat.setMate(potentialMate);
// later, in a new session
secondSession.update(cat);  // update cat
secondSession.update(mate); // update mate</pre>
<p>如果具有<tt class="literal">catId</tt>持久化标识的<tt class="literal">Cat</tt>之前已经被<tt class="literal">另一Session(secondSession)</tt>装载了， 应用程序进行重关联操作(reattach)的时候会抛出一个异常。 </p>
<p><span style="color: #0000ff"><strong>如果你确定当前session没有包含与之具有相同持久化标识的持久实例，使用<tt class="literal">update()</tt>。 如果想随时合并你的的改动而不考虑session的状态，使用<tt class="literal">merge()</tt>。</strong></span> 换句话说，在一个新session中通常第一个调用的是<tt class="literal">update()</tt>方法，以便保证重新关联脱管(detached)对象的操作首先被执行。 </p>
<p>希望相关联的脱管对象（通过引用&#8220;可到达&#8221;的脱管对象）的数据也要更新到数据库时（并且也<span class="emphasis"><em>仅仅</em></span>在这种情况）， 应用程序需要对该相关联的脱管对象单独调用<tt class="literal">update()</tt> 当然这些可以自动完成，即通过使用<span class="emphasis"><em>传播性持久化(transitive persistence)</em></span>，请看<a title="11.11.&nbsp;传播性持久化(transitive persistence)" href="http://docs.huihoo.com/framework/hibernate/reference-v3_zh-cn/objectstate.html#objectstate-transitive" tppabs="http://www.hibernate.org/hib_docs/v3/reference/zh-cn/html/objectstate.html#objectstate-transitive">第&nbsp;11.11&nbsp;节 &#8220;传播性持久化(transitive persistence)&#8221;</a>。 </p>
<p><strong><tt class="literal" style="color: #0000ff">lock()</tt><span style="color: #0000ff">方法也允许程序重新关联某个对象到一个新session上。不过，<span style="color: #ff0000">该脱管(detached)的对象必须是没有修改过的</span></span></strong>！ </p>
<pre class="programlisting">//just reassociate:
sess.lock(fritz, LockMode.NONE);
//do a version check, then reassociate:
sess.lock(izi, LockMode.READ);
//do a version check, using SELECT ... FOR UPDATE, then reassociate:
sess.lock(pk, LockMode.UPGRADE);</pre>
<p>请注意，<tt class="literal">lock()</tt>可以搭配多种<tt class="literal">LockMode</tt>， 更多信息请阅读API文档以及关于事务处理(transaction handling)的章节。重新关联不是<tt class="literal">lock()</tt>的唯一用途。 </p>
<p>其他用于长时间工作单元的模型会在<a title="12.3.&nbsp;乐观并发控制(Optimistic concurrency control)" href="http://docs.huihoo.com/framework/hibernate/reference-v3_zh-cn/transactions.html#transactions-optimistic" tppabs="http://www.hibernate.org/hib_docs/v3/reference/zh-cn/html/transactions.html#transactions-optimistic">第&nbsp;12.3&nbsp;节 &#8220;乐观并发控制(Optimistic concurrency control)&#8221;</a>中讨论。 </p>
文章出处:http://docs.huihoo.com/framework/hibernate/reference-v3_zh-cn/objectstate.html
<img src ="http://www.blogjava.net/keweibo/aggbug/156713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-10-29 16:15 <a href="http://www.blogjava.net/keweibo/articles/156713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Session缓存机制 操纵持久化对象 </title><link>http://www.blogjava.net/keweibo/articles/156578.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 29 Oct 2007 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/156578.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/156578.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/156578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/156578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/156578.html</trackback:ping><description><![CDATA[<p>Session 的缓存<br />
&nbsp;&nbsp;Hibernate中缓存分为两种：一级缓存(Session级别)和二级缓存<br />
(SessionFactory级别)。<br />
&nbsp;&nbsp;&nbsp;Session 的作用:<br />
&nbsp;&nbsp;&nbsp;&nbsp;1)充当蓄水池的作用,减少程序访问数据库的次数.很多对象数据不是经常改变的,第一次访问这些对象时,Hibernate会将它们放<br />
入缓存中,以后只要这个对象没有改动过,访问这个对象时Hibernate就不会去数据库里加载它的数据,而是从内存中直接返回应用程序,这样子效率就比较高了.<br />
&nbsp;&nbsp;&nbsp;&nbsp;2)保证缓存中的数据与数据库同步.缓存毕竟不是数据库,它的数据可能和数据库不一致,这时Hibernate会负责将缓存中的数据同步到数据库.当然这要参照FlushMode的具体设置.<br />
&nbsp;&nbsp; Hibernate向我们提供的主要的操纵数据库的接口,Session就是其中的一个,它提供了基本的增,删,改,查方法.而且具有一个缓存机制,能够按照某个时间点,按照缓存中的持久化对象属性的变化来更新数据库,着就是Session的缓存清理过程.在Hibernate中对象分为三个状态,临时,持久化,游离.如果我们希望JAVA里的一个对象一直存在,就必须有一个变量一直引用着这个对象.当这个变量没了.对象也就被JVM回收了.当然这个是最基本的常识了.当Session的save()方法持久化了一个对象的时候,即使这个对象的引用变量小时了.这个对象也依然存在,因为Sessoin里保存了一个这个对象的引用,当然Session缓存被清空,这个对象就OVER了.在这个对象保存在Sessoin的时候如果调用load()方法试图去数据库中加载一个对象,这个时候Session会先判断缓存中有没有这个对象,如果有了,那么就不需要去数据库加载了.这样可以减少访问数据库的频率,还可以保证缓存中的对象于数据库的同步.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session有两个方法,一个commit()事务提交方法,还有flush()刷新缓存方法,都有着清理缓存的作用,flush()进行缓存的清理,执行一系列的SQL语句,但不会提交事务.而commit()方法会先调用flush()方法,然后在提交事务.Session还有一个方法就是setFushMode()方法,用户设定清理缓存的时间点,主要有下面几种模式,默认Flush.Mode.AUTO<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1)<span style="color: red">FlushMode.AUTO&nbsp; </span>Hibernate&nbsp;判断对象的属性是更改,如果被更改过成了脏数据,则会在下一个查询语句前将更新此改动以保证同步数据库.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)<span style="color: red">FlushMode.COMMIT&nbsp; </span>在事务结束之前清理Session的缓存,其它任何时候都不清理缓存<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)<span style="color: red">FlushMode.NEVER&nbsp; </span>除非强制调用Session的flush()方法,否则永不清理缓存<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4)<span style="color: red">FlushMode.ALWAYS</span> 在每一个查询语句前都调用flush()方法进行缓存清理.<br />
对象的临时状态:刚用new创建对象的时候,它还没有被持久化,这个时候是临时状态.<br />
对象的持久化状态:已经被加入到Session的缓存中,通常所说的持久化对象就是只一个对象在这个状态的时候.<br />
对象的游离状态:已经被持久化,但是不属于Session的缓存的时候是游离状态. </p>
<img src ="http://www.blogjava.net/keweibo/aggbug/156578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-10-29 09:21 <a href="http://www.blogjava.net/keweibo/articles/156578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用Hibernate3的DetachedCriteria实现分页查询 </title><link>http://www.blogjava.net/keweibo/articles/154776.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sun, 21 Oct 2007 13:51:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/154776.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/154776.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/154776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/154776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/154776.html</trackback:ping><description><![CDATA[<p>Hibernate3提供了DetachedCriteria，使得我们可以在Web层构造detachedCriteria，然后调用业务层Bean，进行动态条件查询，根据这一功能，我设计了通用的抽象Bean基类和分页类支持，代码来自于Quake Wang的javaeye-core包的相应类，然后又做了很多修改。</p>
<p>分页支持类：</p>
<p>
<div class="code_title">java 代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.javaeye.common.util; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.util.List; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;PaginationSupport&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;PAGESIZE&nbsp;=&nbsp;</span><span class="number">30</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;pageSize&nbsp;=&nbsp;PAGESIZE; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;List&nbsp;items; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;totalCount; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>[]&nbsp;indexes&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">int</span><span>[</span><span class="number">0</span><span>]; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;startIndex&nbsp;=&nbsp;</span><span class="number">0</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;PaginationSupport(List&nbsp;items,&nbsp;</span><span class="keyword">int</span><span>&nbsp;totalCount)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setPageSize(PAGESIZE); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTotalCount(totalCount); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setItems(items);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setStartIndex(</span><span class="number">0</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;PaginationSupport(List&nbsp;items,&nbsp;</span><span class="keyword">int</span><span>&nbsp;totalCount,&nbsp;</span><span class="keyword">int</span><span>&nbsp;startIndex)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setPageSize(PAGESIZE); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTotalCount(totalCount); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setItems(items);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setStartIndex(startIndex); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;PaginationSupport(List&nbsp;items,&nbsp;</span><span class="keyword">int</span><span>&nbsp;totalCount,&nbsp;</span><span class="keyword">int</span><span>&nbsp;pageSize,&nbsp;</span><span class="keyword">int</span><span>&nbsp;startIndex)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setPageSize(pageSize); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTotalCount(totalCount); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setItems(items); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setStartIndex(startIndex); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;List&nbsp;getItems()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;items; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setItems(List&nbsp;items)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.items&nbsp;=&nbsp;items; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getPageSize()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;pageSize; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setPageSize(</span><span class="keyword">int</span><span>&nbsp;pageSize)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.pageSize&nbsp;=&nbsp;pageSize; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getTotalCount()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;totalCount; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setTotalCount(</span><span class="keyword">int</span><span>&nbsp;totalCount)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(totalCount&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.totalCount&nbsp;=&nbsp;totalCount; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;count&nbsp;=&nbsp;totalCount&nbsp;/&nbsp;pageSize; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(totalCount&nbsp;%&nbsp;pageSize&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>) &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexes&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">int</span><span>[count]; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;count;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexes[i]&nbsp;=&nbsp;pageSize&nbsp;*&nbsp;i; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.totalCount&nbsp;=&nbsp;</span><span class="number">0</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>[]&nbsp;getIndexes()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;indexes; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setIndexes(</span><span class="keyword">int</span><span>[]&nbsp;indexes)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.indexes&nbsp;=&nbsp;indexes; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getStartIndex()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;startIndex; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setStartIndex(</span><span class="keyword">int</span><span>&nbsp;startIndex)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(totalCount&nbsp;&lt;=&nbsp;</span><span class="number">0</span><span>) &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.startIndex&nbsp;=&nbsp;</span><span class="number">0</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(startIndex&nbsp;&gt;=&nbsp;totalCount) &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.startIndex&nbsp;=&nbsp;indexes[indexes.length&nbsp;-&nbsp;</span><span class="number">1</span><span>]; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(startIndex&nbsp;&lt;&nbsp;</span><span class="number">0</span><span>) &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.startIndex&nbsp;=&nbsp;</span><span class="number">0</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.startIndex&nbsp;=&nbsp;indexes[startIndex&nbsp;/&nbsp;pageSize]; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getNextIndex()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;nextIndex&nbsp;=&nbsp;getStartIndex()&nbsp;+&nbsp;pageSize; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(nextIndex&nbsp;&gt;=&nbsp;totalCount) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;getStartIndex(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;nextIndex; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getPreviousIndex()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;previousIndex&nbsp;=&nbsp;getStartIndex()&nbsp;-&nbsp;pageSize; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(previousIndex&nbsp;&lt;&nbsp;</span><span class="number">0</span><span>) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="number">0</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;previousIndex; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script></p>
<p>&nbsp;</p>
<p>抽象业务类 <br />
<div class="code_title">java 代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">/** </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;Created&nbsp;on&nbsp;2005-7-12 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">package</span><span>&nbsp;com.javaeye.common.business; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;java.io.Serializable; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.util.List; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.hibernate.Criteria; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.hibernate.HibernateException; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.hibernate.Session; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.hibernate.criterion.DetachedCriteria; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.hibernate.criterion.Projections; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.springframework.orm.hibernate3.HibernateCallback; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.springframework.orm.hibernate3.support.HibernateDaoSupport; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;com.javaeye.common.util.PaginationSupport; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;AbstractManager&nbsp;</span><span class="keyword">extends</span><span>&nbsp;HibernateDaoSupport&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;cacheQueries&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;queryCacheRegion; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setCacheQueries(</span><span class="keyword">boolean</span><span>&nbsp;cacheQueries)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.cacheQueries&nbsp;=&nbsp;cacheQueries; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setQueryCacheRegion(String&nbsp;queryCacheRegion)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.queryCacheRegion&nbsp;=&nbsp;queryCacheRegion; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;save(</span><span class="keyword">final</span><span>&nbsp;Object&nbsp;entity)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHibernateTemplate().save(entity); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;persist(</span><span class="keyword">final</span><span>&nbsp;Object&nbsp;entity)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHibernateTemplate().save(entity); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;update(</span><span class="keyword">final</span><span>&nbsp;Object&nbsp;entity)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHibernateTemplate().update(entity); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;delete(</span><span class="keyword">final</span><span>&nbsp;Object&nbsp;entity)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHibernateTemplate().delete(entity); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;load(</span><span class="keyword">final</span><span>&nbsp;Class&nbsp;entity,&nbsp;</span><span class="keyword">final</span><span>&nbsp;Serializable&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;getHibernateTemplate().load(entity,&nbsp;id); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;get(</span><span class="keyword">final</span><span>&nbsp;Class&nbsp;entity,&nbsp;</span><span class="keyword">final</span><span>&nbsp;Serializable&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;getHibernateTemplate().get(entity,&nbsp;id); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;List&nbsp;findAll(</span><span class="keyword">final</span><span>&nbsp;Class&nbsp;entity)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;getHibernateTemplate().find(</span><span class="string">"from&nbsp;"</span><span>&nbsp;+&nbsp;entity.getName()); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;List&nbsp;findByNamedQuery(</span><span class="keyword">final</span><span>&nbsp;String&nbsp;namedQuery)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;getHibernateTemplate().findByNamedQuery(namedQuery); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;List&nbsp;findByNamedQuery(</span><span class="keyword">final</span><span>&nbsp;String&nbsp;query,&nbsp;</span><span class="keyword">final</span><span>&nbsp;Object&nbsp;parameter)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;getHibernateTemplate().findByNamedQuery(query,&nbsp;parameter); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;List&nbsp;findByNamedQuery(</span><span class="keyword">final</span><span>&nbsp;String&nbsp;query,&nbsp;</span><span class="keyword">final</span><span>&nbsp;Object[]&nbsp;parameters)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;getHibernateTemplate().findByNamedQuery(query,&nbsp;parameters); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;List&nbsp;find(</span><span class="keyword">final</span><span>&nbsp;String&nbsp;query)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;getHibernateTemplate().find(query); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;List&nbsp;find(</span><span class="keyword">final</span><span>&nbsp;String&nbsp;query,&nbsp;</span><span class="keyword">final</span><span>&nbsp;Object&nbsp;parameter)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;getHibernateTemplate().find(query,&nbsp;parameter); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;PaginationSupport&nbsp;findPageByCriteria(</span><span class="keyword">final</span><span>&nbsp;DetachedCriteria&nbsp;detachedCriteria)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;findPageByCriteria(detachedCriteria,&nbsp;PaginationSupport.PAGESIZE,&nbsp;</span><span class="number">0</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;PaginationSupport&nbsp;findPageByCriteria(</span><span class="keyword">final</span><span>&nbsp;DetachedCriteria&nbsp;detachedCriteria,&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;startIndex)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;findPageByCriteria(detachedCriteria,&nbsp;PaginationSupport.PAGESIZE,&nbsp;startIndex); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;PaginationSupport&nbsp;findPageByCriteria(</span><span class="keyword">final</span><span>&nbsp;DetachedCriteria&nbsp;detachedCriteria,&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;pageSize, &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;startIndex)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(PaginationSupport)&nbsp;getHibernateTemplate().execute(</span><span class="keyword">new</span><span>&nbsp;HibernateCallback()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;HibernateException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;criteria&nbsp;=&nbsp;detachedCriteria.getExecutableCriteria(session); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;totalCount&nbsp;=&nbsp;((Integer)&nbsp;criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.setProjection(</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;items&nbsp;=&nbsp;criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaginationSupport&nbsp;ps&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PaginationSupport(items,&nbsp;totalCount,&nbsp;pageSize,&nbsp;startIndex); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;ps; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;List&nbsp;findAllByCriteria(</span><span class="keyword">final</span><span>&nbsp;DetachedCriteria&nbsp;detachedCriteria)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(List)&nbsp;getHibernateTemplate().execute(</span><span class="keyword">new</span><span>&nbsp;HibernateCallback()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;HibernateException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;criteria&nbsp;=&nbsp;detachedCriteria.getExecutableCriteria(session); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;criteria.list(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getCountByCriteria(</span><span class="keyword">final</span><span>&nbsp;DetachedCriteria&nbsp;detachedCriteria)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;count&nbsp;=&nbsp;(Integer)&nbsp;getHibernateTemplate().execute(</span><span class="keyword">new</span><span>&nbsp;HibernateCallback()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;HibernateException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;criteria&nbsp;=&nbsp;detachedCriteria.getExecutableCriteria(session); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;criteria.setProjection(Projections.rowCount()).uniqueResult(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;count.intValue(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script></p>
<p>&nbsp;</p>
<p>用户在web层构造查询条件detachedCriteria，和可选的startIndex，调用业务bean的相应findByCriteria方法，返回一个PaginationSupport的实例ps。</p>
<p>ps.getItems()得到已分页好的结果集 <br />
ps.getIndexes()得到分页索引的数组 <br />
ps.getTotalCount()得到总结果数 <br />
ps.getStartIndex()当前分页索引 <br />
ps.getNextIndex()下一页索引 <br />
ps.getPreviousIndex()上一页索引<br />
<br />
<span style="color: red">文章出处:http://www.javaeye.com/topic/14657</span></p>
 <img src ="http://www.blogjava.net/keweibo/aggbug/154776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-10-21 21:51 <a href="http://www.blogjava.net/keweibo/articles/154776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Criteria</title><link>http://www.blogjava.net/keweibo/articles/152160.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Thu, 11 Oct 2007 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/152160.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/152160.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/152160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/152160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/152160.html</trackback:ping><description><![CDATA[<li class="alt"><span><span>具有一个直观的、可扩展的条件查询API是Hibernate的特色。&nbsp; &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span class="number">15.1</span><span>.&nbsp;创建一个Criteria&nbsp;实例 &nbsp;&nbsp;</span></span></li>
<li class=""><span>org.hibernate.Criteria接口表示特定持久类的一个查询。Session是&nbsp;Criteria实例的工厂。&nbsp; &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>Criteria&nbsp;crit&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>crit.setMaxResults(</span><span class="number">50</span><span>); &nbsp;&nbsp;</span></span></li>
<li class=""><span>List&nbsp;cats&nbsp;=&nbsp;crit.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span class="number">15.2</span><span>.&nbsp;限制结果集内容 &nbsp;&nbsp;</span></span></li>
<li class=""><span>一个单独的查询条件是org.hibernate.criterion.Criterion&nbsp;接口的一个实例。org.hibernate.criterion.Restrictions类&nbsp;定义了获得某些内置Criterion类型的工厂方法。&nbsp; &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span class="string">"name"</span><span>,&nbsp;</span><span class="string">"Fritz%"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.between(</span><span class="string">"weight"</span><span>,&nbsp;minWeight,&nbsp;maxWeight)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class=""><span>约束可以按逻辑分组。&nbsp; &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span class="string">"name"</span><span>,&nbsp;</span><span class="string">"Fritz%"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.or( &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Restrictions.eq(&nbsp;</span><span class="string">"age"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Integer(</span><span class="number">0</span><span>)&nbsp;), &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Restrictions.isNull(</span><span class="string">"age"</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;) &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.in(&nbsp;</span><span class="string">"name"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;String[]&nbsp;{&nbsp;</span><span class="string">"Fritz"</span><span>,&nbsp;</span><span class="string">"Izi"</span><span>,&nbsp;</span><span class="string">"Pk"</span><span>&nbsp;}&nbsp;)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.disjunction() &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.isNull(</span><span class="string">"age"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eq(</span><span class="string">"age"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Integer(</span><span class="number">0</span><span>)&nbsp;)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eq(</span><span class="string">"age"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Integer(</span><span class="number">1</span><span>)&nbsp;)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eq(</span><span class="string">"age"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Integer(</span><span class="number">2</span><span>)&nbsp;)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;) &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class=""><span>Hibernate提供了相当多的内置criterion类型(Restrictions&nbsp;子类),&nbsp;但是尤其有用的是可以允许你直接使用SQL。&nbsp; &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.sql(</span><span class="string">"lower({alias}.name)&nbsp;like&nbsp;lower(?)"</span><span>,&nbsp;</span><span class="string">"Fritz%"</span><span>,&nbsp;Hibernate.STRING)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>{alias}占位符应当被替换为被查询实体的列别名。&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName()&nbsp;创建一个Property。&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>Property&nbsp;age&nbsp;=&nbsp;Property.forName(</span><span class="string">"age"</span><span>); &nbsp;&nbsp;</span></span></li>
<li class=""><span>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.disjunction() &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;age.isNull()&nbsp;) &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;age.eq(&nbsp;</span><span class="keyword">new</span><span>&nbsp;Integer(</span><span class="number">0</span><span>)&nbsp;)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;age.eq(&nbsp;</span><span class="keyword">new</span><span>&nbsp;Integer(</span><span class="number">1</span><span>)&nbsp;)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;age.eq(&nbsp;</span><span class="keyword">new</span><span>&nbsp;Integer(</span><span class="number">2</span><span>)&nbsp;)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;) &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span class="string">"name"</span><span>).in(&nbsp;</span><span class="keyword">new</span><span>&nbsp;String[]&nbsp;{&nbsp;</span><span class="string">"Fritz"</span><span>,&nbsp;</span><span class="string">"Izi"</span><span>,&nbsp;</span><span class="string">"Pk"</span><span>&nbsp;}&nbsp;)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span class="number">15.3</span><span>.&nbsp;结果集排序 &nbsp;&nbsp;</span></span></li>
<li class=""><span>你可以使用org.hibernate.criterion.Order来为查询结果排序。&nbsp; &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span class="string">"name"</span><span>,&nbsp;</span><span class="string">"F%"</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span class="string">"name"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc(</span><span class="string">"age"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(</span><span class="number">50</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class=""><span>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span class="string">"name"</span><span>).like(</span><span class="string">"F%"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Property.forName(</span><span class="string">"name"</span><span>).asc()&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Property.forName(</span><span class="string">"age"</span><span>).desc()&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(</span><span class="number">50</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class=""><span class="number">15.4</span><span>.&nbsp;关联 &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>你可以使用createCriteria()非常容易的在互相关联的实体间建立&nbsp;约束。&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span class="string">"name"</span><span>,&nbsp;</span><span class="string">"F%"</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria(</span><span class="string">"kittens"</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span class="string">"name"</span><span>,&nbsp;</span><span class="string">"F%"</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class=""><span>注意第二个&nbsp;createCriteria()返回一个新的&nbsp;Criteria实例，该实例引用kittens&nbsp;集合中的元素。&nbsp; &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>接下来，替换形态在某些情况下也是很有用的。&nbsp; &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.createAlias(</span><span class="string">"kittens"</span><span>,&nbsp;</span><span class="string">"kt"</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.createAlias(</span><span class="string">"mate"</span><span>,&nbsp;</span><span class="string">"mt"</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eqProperty(</span><span class="string">"kt.name"</span><span>,&nbsp;</span><span class="string">"mt.name"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>(createAlias()并不创建一个新的&nbsp;Criteria实例。)&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>Cat实例所保存的之前两次查询所返回的kittens集合是&nbsp;没有被条件预过滤的。如果你希望只获得符合条件的kittens，&nbsp;你必须使用returnMaps()。&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria(</span><span class="string">"kittens"</span><span>,&nbsp;</span><span class="string">"kt"</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eq(</span><span class="string">"name"</span><span>,&nbsp;</span><span class="string">"F%"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.returnMaps() &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class=""><span>Iterator&nbsp;iter&nbsp;=&nbsp;cats.iterator(); &nbsp;&nbsp;</span></li>
<li class="alt"><span class="keyword">while</span><span>&nbsp;(&nbsp;iter.hasNext()&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;=&nbsp;(Map)&nbsp;iter.next(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;cat&nbsp;=&nbsp;(Cat)&nbsp;map.get(Criteria.ROOT_ALIAS); &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;kitten&nbsp;=&nbsp;(Cat)&nbsp;map.get(</span><span class="string">"kt"</span><span>); &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>} &nbsp;&nbsp;</span></li>
<li class=""><span class="number">15.5</span><span>.&nbsp;动态关联抓取 &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>你可以使用setFetchMode()在运行时定义动态关联抓取的语义。&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span class="string">"name"</span><span>,&nbsp;</span><span class="string">"Fritz%"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.setFetchMode(</span><span class="string">"mate"</span><span>,&nbsp;FetchMode.EAGER) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.setFetchMode(</span><span class="string">"kittens"</span><span>,&nbsp;FetchMode.EAGER) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class=""><span>这个查询可以通过外连接抓取mate和kittens。&nbsp;查看第&nbsp;</span><span class="number">19.1</span><span>&nbsp;节&nbsp;&#8220;&nbsp;抓取策略(Fetching&nbsp;strategies)&nbsp;&#8221;可以获得更多信息。&nbsp; &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span class="number">15.6</span><span>.&nbsp;查询示例 &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>org.hibernate.criterion.Example类允许你通过一个给定实例&nbsp;构建一个条件查询。&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>Cat&nbsp;cat&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Cat(); &nbsp;&nbsp;</span></span></li>
<li class=""><span>cat.setSex('F'); &nbsp;&nbsp;</span></li>
<li class="alt"><span>cat.setColor(Color.BLACK); &nbsp;&nbsp;</span></li>
<li class=""><span>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(cat)&nbsp;) &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>版本属性、标识符和关联被忽略。默认情况下值为</span><span class="keyword">null</span><span>的属性将被排除。&nbsp; &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>你可以自行调整Example使之更实用。&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>Example&nbsp;example&nbsp;=&nbsp;Example.create(cat) &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.excludeZeroes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//exclude&nbsp;zero&nbsp;valued&nbsp;properties </span><span>&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.excludeProperty(</span><span class="string">"color"</span><span>)&nbsp;&nbsp;</span><span class="comment">//exclude&nbsp;the&nbsp;property&nbsp;named&nbsp;"color" </span><span>&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.ignoreCase()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//perform&nbsp;case&nbsp;insensitive&nbsp;string&nbsp;comparisons </span><span>&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.enableLike();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//use&nbsp;like&nbsp;for&nbsp;string&nbsp;comparisons </span><span>&nbsp;&nbsp;</span></span></li>
<li class=""><span>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(example) &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>你甚至可以使用examples在关联对象上放置条件。&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(cat)&nbsp;) &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria(</span><span class="string">"mate"</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(&nbsp;cat.getMate()&nbsp;)&nbsp;) &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class=""><span class="number">15.7</span><span>.&nbsp;投影(Projections)、聚合（aggregation）和分组（grouping） &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>org.hibernate.criterion.Projections是&nbsp;Projection&nbsp;的实例工厂。我们通过调用&nbsp;setProjection()应用投影到一个查询。&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.rowCount()&nbsp;) &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eq(</span><span class="string">"color"</span><span>,&nbsp;Color.BLACK)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList() &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.rowCount()&nbsp;) &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.avg(</span><span class="string">"weight"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.max(</span><span class="string">"weight"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.groupProperty(</span><span class="string">"color"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>在一个条件查询中没有必要显式的使用&nbsp;</span><span class="string">"group&nbsp;by"</span><span>&nbsp;。某些投影类型就是被定义为&nbsp;分组投影，他们也出现在SQL的group&nbsp;by子句中。&nbsp; &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>你可以选择把一个别名指派给一个投影，这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式：&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.alias(&nbsp;Projections.groupProperty(</span><span class="string">"color"</span><span>),&nbsp;</span><span class="string">"colr"</span><span>&nbsp;)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span class="string">"colr"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.groupProperty(</span><span class="string">"color"</span><span>).as(</span><span class="string">"colr"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span class="string">"colr"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>alias()和as()方法简便的将一个投影实例包装到另外一个&nbsp;别名的Projection实例中。简而言之，当你添加一个投影到一个投影列表中时&nbsp;你可以为它指定一个别名：&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList() &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.rowCount(),&nbsp;</span><span class="string">"catCountByColor"</span><span>&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.avg(</span><span class="string">"weight"</span><span>),&nbsp;</span><span class="string">"avgWeight"</span><span>&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.max(</span><span class="string">"weight"</span><span>),&nbsp;</span><span class="string">"maxWeight"</span><span>&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.groupProperty(</span><span class="string">"color"</span><span>),&nbsp;</span><span class="string">"color"</span><span>&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc(</span><span class="string">"catCountByColor"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc(</span><span class="string">"avgWeight"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Domestic.</span><span class="keyword">class</span><span>,&nbsp;</span><span class="string">"cat"</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.createAlias(</span><span class="string">"kittens"</span><span>,&nbsp;</span><span class="string">"kit"</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList() &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.property(</span><span class="string">"cat.name"</span><span>),&nbsp;</span><span class="string">"catName"</span><span>&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.property(</span><span class="string">"kit.name"</span><span>),&nbsp;</span><span class="string">"kitName"</span><span>&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span class="string">"catName"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span class="string">"kitName"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class=""><span>你也可以使用Property.forName()来表示投影：&nbsp; &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName(</span><span class="string">"name"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span class="string">"color"</span><span>).eq(Color.BLACK)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class=""><span>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList() &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.rowCount().as(</span><span class="string">"catCountByColor"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span class="string">"weight"</span><span>).avg().as(</span><span class="string">"avgWeight"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span class="string">"weight"</span><span>).max().as(</span><span class="string">"maxWeight"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span class="string">"color"</span><span>).group().as(</span><span class="string">"color"</span><span>&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc(</span><span class="string">"catCountByColor"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc(</span><span class="string">"avgWeight"</span><span>)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.list(); &nbsp;&nbsp;</span></li>
<li class=""><span class="number">15.8</span><span>.&nbsp;离线(detached)查询和子查询 &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>DetachedCriteria类使你在一个session范围之外创建一个查询，并且可以使用任意的&nbsp;Session来执行它。&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>DetachedCriteria&nbsp;query&nbsp;=&nbsp;DetachedCriteria.forClass(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span class="string">"sex"</span><span>).eq('F')&nbsp;); &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>Session&nbsp;session&nbsp;=&nbsp;....; &nbsp;&nbsp;</span></li>
<li class="alt"><span>Transaction&nbsp;txn&nbsp;=&nbsp;session.beginTransaction(); &nbsp;&nbsp;</span></li>
<li class=""><span>List&nbsp;results&nbsp;=&nbsp;query.getExecutableCriteria(session).setMaxResults(</span><span class="number">100</span><span>).list(); &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>txn.commit(); &nbsp;&nbsp;</span></li>
<li class=""><span>session.close(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过&nbsp;Subqueries或者Property获得。&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>DetachedCriteria&nbsp;avgWeight&nbsp;=&nbsp;DetachedCriteria.forClass(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>.setProjection(&nbsp;Property.forName(</span><span class="string">"weight"</span><span>).avg()&nbsp;); &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>session.createCriteria(Cat.</span><span class="keyword">class</span><span>) &nbsp;&nbsp;</span></span></li>
<li class=""><span>.add(&nbsp;Property.forName(</span><span class="string">"weight).gt(avgWeight)&nbsp;) </span>&nbsp;</span></li>
<li class="alt"><span><span class="string">.list(); </span>&nbsp;</span></li>
<li class=""><span><span class="string">DetachedCriteria&nbsp;weights&nbsp;=&nbsp;DetachedCriteria.forClass(Cat.class) </span>&nbsp;</span></li>
<li class="alt"><span><span class="string">.setProjection(&nbsp;Property.forName("</span><span>weight</span><span class="string">")&nbsp;); </span>&nbsp;</span></li>
<li class=""><span><span class="string">session.createCriteria(Cat.class) </span>&nbsp;</span></li>
<li class="alt"><span><span class="string">.add(&nbsp;Subqueries.geAll("</span><span>weight</span><span class="string">",&nbsp;weights)&nbsp;) </span>&nbsp;</span></li>
<li class=""><span><span class="string">.list(); </span>&nbsp;</span></li>
<li class="alt"><span><span class="string">甚至相互关联的子查询也是有可能的：&nbsp; </span>&nbsp;</span></li>
<li class=""><span>&nbsp;</span></li>
<li class="alt"><span><span class="string">DetachedCriteria&nbsp;avgWeightForSex&nbsp;=&nbsp;DetachedCriteria.forClass(Cat.class,&nbsp;"</span><span>cat2</span><span class="string">") </span>&nbsp;</span></li>
<li class=""><span><span class="string">.setProjection(&nbsp;Property.forName("</span><span>weight</span><span class="string">").avg()&nbsp;) </span>&nbsp;</span></li>
<li class="alt"><span><span class="string">.add(&nbsp;Property.forName("</span><span>cat2.sex</span><span class="string">").eqProperty("</span><span>cat.sex</span><span class="string">")&nbsp;); </span>&nbsp;</span></li>
<li class=""><span><span class="string">session.createCriteria(Cat.class,&nbsp;"</span><span>cat</span><span class="string">") </span>&nbsp;</span></li>
<li class="alt"><span><span class="string">.add(&nbsp;Property.forName("</span><span>weight).gt(avgWeightForSex)&nbsp;) &nbsp;&nbsp;</span></span></li>
<li class=""><span>.list(); &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;</span><span class="comment">//具体应用 </span><span>&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>把HSQL语句用Criteria代替，感觉更加美观一点，而且还支持中文，要是HSQL想支持中文，你得使用占位符来设置，具体可参照：http:</span><span class="comment">//.blogdriver.com//983190.html </span><span>&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>那么Criteria的用法是这样的： &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Collection&nbsp;findCriteria(</span><span class="keyword">final</span><span>&nbsp;DetachedCriteria&nbsp;dc,&nbsp;</span><span class="keyword">final</span><span>&nbsp;IPage&nbsp;page)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(List)&nbsp;getHibernateTemplate().execute(</span><span class="keyword">new</span><span>&nbsp;HibernateCallback(){ &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;HibernateException,&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;c&nbsp;=&nbsp;dc.getExecutableCriteria(session); &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page.setTotalCount(((Integer)&nbsp;c.setProjection(Projections.rowCount()).uniqueResult()).intValue());&nbsp; &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.setProjection(</span><span class="keyword">null</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.setResultTransformer(Criteria.ROOT_ENTITY); &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.setFirstResult(page.getBeginIndex()); &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.setMaxResults(page.getPageSize()); &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;c.list(); &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>其中的参数</span><span class="keyword">true</span><span>表示要Spring强制传入SessionImpl，而不是传入Proxy代理类，page.setTotalCount(((Integer)&nbsp;c.setProjection(Projections.rowCount()).uniqueResult()).intValue());&nbsp; &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>c.setProjection(</span><span class="keyword">null</span><span>);&nbsp;目的是为了获得行数，并设置投影为空，为的是返回List出来，如果不设置setProjection(</span><span class="keyword">null</span><span>)的话，c.list将返回的是行数(</span><span class="keyword">int</span><span>型)，而不是所要查询的数据库信息。但是Criteria的ResultTransformer会变成PassThroughResultTransformer，criteria.list的时候可能结果会跟理想的不一样。所以我们还要再c.setResultTransformer(Criteria.ROOT_ENTITY);把结果以Entity的形式返回，而不是Object[]的形式返回。具体的ResultTransformer可以google一下。 &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>测试代码如下： &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testCriteria()&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DetachedCriteria&nbsp;dc&nbsp;=&nbsp;DetachedCriteria.forClass(User.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.add(Restrictions.eq(</span><span class="string">"name"</span><span>,&nbsp;</span><span class="string">"user"</span><span>)).add(Restrictions.like(</span><span class="string">"description"</span><span>,&nbsp;</span><span class="string">"%主管人员%"</span><span>)); &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPage&nbsp;page&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Page(); &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page.setCurrentPage(</span><span class="number">1</span><span>); &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page.setPageSize(</span><span class="number">10</span><span>); &nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection&nbsp;list&nbsp;=&nbsp;_userDAO.findCriteria(dc,&nbsp;page); &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertNotNull(list); &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span><span class="number">1</span><span>,&nbsp;list.size()); &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>来源：http:</span><span class="comment">//aimtime812110.spaces.msn.com/Blog/cns!1pXyGS-D6ufSs-1GPdk-fkiQ!108.entry&nbsp;</span><span>&nbsp;&nbsp;</span></span></li>
<img src ="http://www.blogjava.net/keweibo/aggbug/152160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-10-11 22:13 <a href="http://www.blogjava.net/keweibo/articles/152160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> HibernateTemplate的常规用法</title><link>http://www.blogjava.net/keweibo/articles/150094.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 01 Oct 2007 11:55:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/150094.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/150094.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/150094.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/150094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/150094.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; line-height: 15.7pt">HibernateTemplate<span style="font-family: 宋体">提供非常多的常用方法来完成基本的操作，比如通常的增加、删除、修改、查询等操作，</span>Spring 2.0<span style="font-family: 宋体">更增加对命名</span>SQL<span style="font-family: 宋体">查询的支持，也增加对分页的支持。大部分情况下，使用</span>Hibernate<span style="font-family: 宋体">的常规用法，就可完成大多数</span>DAO<span style="font-family: 宋体">对象的</span>CRUD<span style="font-family: 宋体">操作。下面是</span>HibernateTemplate<span style="font-family: 宋体">的常用方法简介：</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>void delete(Object entity)<span style="font-family: 宋体">：删除指定持久化实例</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>deleteAll(Collection entities)<span style="font-family: 宋体">：删除集合内全部持久化类实例</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>find(String queryString)<span style="font-family: 宋体">：根据</span>HQL<span style="font-family: 宋体">查询字符串来返回实例集合</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>findByNamedQuery(String queryName)<span style="font-family: 宋体">：根据命名查询返回实例集合</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>get(Class entityClass, Serializable id)<span style="font-family: 宋体">：根据主键加载特定持久化类的实例</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>save(Object entity)<span style="font-family: 宋体">：保存新的实例</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>saveOrUpdate(Object entity)<span style="font-family: 宋体">：根据实例状态，选择保存或者更新</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>update(Object entity)<span style="font-family: 宋体">：更新实例的状态，要求</span>entity<span style="font-family: 宋体">是持久状态</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>setMaxResults(int maxResults)<span style="font-family: 宋体">：设置分页的大小</span></p>
<p style="margin-left: 21.25pt; text-indent: 0cm"><span style="font-family: 宋体">下面是一个完整</span>DAO<span style="font-family: 宋体">类的源代码：</span></p>
<p>public class PersonDAOHibernate implements PersonDAO</p>
<p>{</p>
<p style="text-align: left" align="left">&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">采用</span>log4j<span style="font-family: 黑体">来完成调试时的日志功能</span></p>
<p style="text-indent: 21pt">private static Log log = LogFactory.getLog(NewsDAOHibernate.class);</p>
<p>&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">以私有的成员变量来保存</span>SessionFactory<span style="font-family: 黑体">。</span></p>
<p style="text-indent: 21pt">private SessionFactory sessionFactory;</p>
<p style="text-indent: 21pt">//<span style="font-family: 黑体">以私有变量的方式保存</span>HibernateTemplate</p>
<p style="text-indent: 21pt">private HibernateTemplate hibernateTemplate = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">设值注入</span>SessionFactory<span style="font-family: 黑体">必需的</span>setter<span style="font-family: 黑体">方法</span></p>
<p>&nbsp;&nbsp;&nbsp; public void setSessionFactory(SessionFactory sessionFactory) </p>
<p style="text-indent: 21pt">{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; this.sessionFactory = sessionFactory;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">初始化本</span>DAO<span style="font-family: 黑体">所需的</span>HibernateTemplate</p>
<p style="text-indent: 21pt">public HIbernateTemplate getHibernateTemplate() </p>
<p style="text-indent: 21pt">{</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">首先，检查原来的</span>hibernateTemplate<span style="font-family: 黑体">实例是否还存在</span></p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( hibernateTemplate == null)</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">如果不存在，新建一个</span>HibernateTemplate<span style="font-family: 黑体">实例</span></p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hibernateTemplate = new HibernateTemplate(sessionFactory);</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return hibernateTemplate;</p>
<p style="text-indent: 21pt">}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">返回全部的人的实例</span></p>
<p>&nbsp;&nbsp;&nbsp; public List getPersons()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">通过</span>HibernateTemplate<span style="font-family: 黑体">的</span>find<span style="font-family: 黑体">方法返回</span>Person<span style="font-family: 黑体">的全部实例</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; return getHibernateTemplate().find("from Person");</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* <span style="font-family: 黑体">根据主键返回特定实例</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* @ return <span style="font-family: 黑体">特定主键对应的</span>Person<span style="font-family: 黑体">实例</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* @ param <span style="font-family: 黑体">主键值</span></p>
<p>&nbsp;&nbsp;&nbsp; public News getNews(int personid)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; return (Person)getHibernateTemplate().get(Person.class, new Integer(personid));</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* @ person <span style="font-family: 黑体">需要保存的</span>Person<span style="font-family: 黑体">实例</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/</p>
<p>&nbsp;&nbsp;&nbsp; public void savePerson(Person person)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getHibernateTemplate().saveOrUpdate(person);</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* @ param personid <span style="font-family: 黑体">需要删除</span>Person<span style="font-family: 黑体">实例的主键</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* /</p>
<p>&nbsp;&nbsp;&nbsp; public void removePerson(int personid)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">先加载特定实例</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Object p = getHibernateTemplate().load(Person.class, new Integer(personid));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">删除特定实例</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; getHibernateTemplate().delete(p);</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/150094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-10-01 19:55 <a href="http://www.blogjava.net/keweibo/articles/150094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Hibernate的复杂用法HibernateCallback</title><link>http://www.blogjava.net/keweibo/articles/150093.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 01 Oct 2007 11:54:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/150093.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/150093.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/150093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/150093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/150093.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; line-height: 15.7pt">HibernateTemplate<span style="font-family: 宋体">还提供一种更加灵活的方式来操作数据库，通过这种方式可以完全使用</span>Hibernate<span style="font-family: 宋体">的操作方式。</span>HibernateTemplate<span style="font-family: 宋体">的灵活访问方式是通过如下两个方法完成：</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Object execute(HibernateCallback action)</p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>List execute(HibernateCallback action)</p>
<p style="text-indent: 21pt; line-height: 15.7pt"><span style="font-family: 宋体">这两个方法都需要一个</span>HibernateCallback<span style="font-family: 宋体">的实例，</span>HibernateCallback<span style="font-family: 宋体">实例可在任何有效的</span>Hibernate<span style="font-family: 宋体">数据访问中使用。程序开发者通过</span>HibernateCallback<span style="font-family: 宋体">，可以完全使用</span>Hibernate<span style="font-family: 宋体">灵活的方式来访问数据库，解决</span>Spring<span style="font-family: 宋体">封装</span>Hibernate<span style="font-family: 宋体">后灵活性不足的缺陷。</span>HibernateCallback<span style="font-family: 宋体">是一个接口，该接口只有一个方法</span>doInHibernate(org.hibernate.Session&nbsp;session)<span style="font-family: 宋体">，该方法只有一个参数</span>Session<span style="font-family: 宋体">。</span></p>
<p style="text-indent: 21pt; line-height: 15.7pt"><span style="font-family: 宋体">通常，程序中采用实现</span>HibernateCallback<span style="font-family: 宋体">的匿名内部类来获取</span>HibernateCallback<span style="font-family: 宋体">的实例，方法</span>doInHibernate<span style="font-family: 宋体">的方法体就是</span>Spring<span style="font-family: 宋体">执行的持久化操作。具体代码如下：</span></p>
<p>public class PersonDaoImpl implements PersonDao</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">私有实例变量保存</span>SessionFactory</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private SessionFactory sessionFactory;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">依赖注入必须的</span>setter<span style="font-family: 黑体">方法</span></p>
<p>&nbsp;&nbsp;&nbsp; public void setSessionFactory(SessionFactory sessionFactory) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; this.sessionFactory = sessionFactory;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* <span style="font-family: 黑体">通过人名查找所有匹配该名的</span>Person<span style="font-family: 黑体">实例</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* @param name <span style="font-family: 黑体">匹配的人名</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* @return <span style="font-family: 黑体">匹配该任命的全部</span>Person<span style="font-family: 黑体">集合</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/</p>
<p>&nbsp;&nbsp;&nbsp; public List findPersonsByName(final String name)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //<span style="font-family: 黑体">创建</span>HibernateTemplate<span style="font-family: 黑体">实例</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateTemplate hibernateTemplate =</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new HibernateTemplate(this.sessionFactory);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //<span style="font-family: 黑体">返回</span>HibernateTemplate<span style="font-family: 黑体">的</span>execute<span style="font-family: 黑体">的结果</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (List) hibernateTemplate.execute(</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">创建匿名内部类</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new HibernateCallback()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object doInHibernate(Session session) throws HibernateException</p>
<p>&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; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 黑体">使用条件查询的方法返回</span></p>
<p>&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;&nbsp;&nbsp;&nbsp;&nbsp; List result = session.createCriteria(Person.class)</p>
<p>&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;&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; &nbsp;&nbsp;&nbsp; .add(Restrictions.like(&#8220;name&#8221;, name+&#8221;%&#8221;)</p>
<p>&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .list();</p>
<p>&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;&nbsp;&nbsp; return result;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p style="text-indent: 21pt; line-height: 15.7pt"><span style="font-family: 宋体">注意：方法</span>doInHibernate<span style="font-family: 宋体">方法内可以访问</span>Session<span style="font-family: 宋体">，该</span>Session<span style="font-family: 宋体">对象是绑定到该线程的</span>Session<span style="font-family: 宋体">实例。该方法内的持久层操作，与不使用</span>Spring<span style="font-family: 宋体">时的持久层操作完全相同。这保证对于复杂的持久层访问，依然可以使用</span>Hibernate<span style="font-family: 宋体">的访问方式。</span></p>
<img src ="http://www.blogjava.net/keweibo/aggbug/150093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-10-01 19:54 <a href="http://www.blogjava.net/keweibo/articles/150093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3.x调用存储过程 </title><link>http://www.blogjava.net/keweibo/articles/145983.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 17 Sep 2007 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/145983.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/145983.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/145983.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/145983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/145983.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Hibernate3.x调用存储过程 原文出处：http://tech.it168.com/j/d/2007-05-14/200705141007843.shtml说明：该文不得转载摘要：本文以详尽的实例展示了hibernate3.x中调用存储过程各步骤，从建立测试表、存储过程的建立、工程的建立以及类的编写和测试一步一步引导用户学习hibernate3.x中调用存储过程的方法.如果...&nbsp;&nbsp;<a href='http://www.blogjava.net/keweibo/articles/145983.html'>阅读全文</a><img src ="http://www.blogjava.net/keweibo/aggbug/145983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-09-17 22:09 <a href="http://www.blogjava.net/keweibo/articles/145983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Hibernate的检索策略</title><link>http://www.blogjava.net/keweibo/articles/145535.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sun, 16 Sep 2007 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/145535.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/145535.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/145535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/145535.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/145535.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;Hibernate的检索策略立即检索、延迟检索，预先抓取和批量检索都是为了优化加载性能而设置的策略。立即加载、延迟加载、预先抓取是同一级别的策略，因为它们是三选一的策略。用了其中一个则另外两个就不可用了，而且被延迟加载的对象当最终被加载时，一定是使用了立即加载的形式。如果在配置文件中设置了对某个属性的预先抓取，则对此属性的其他加载设置全部失效（比如还设置了延迟加载，此时失效）。...&nbsp;&nbsp;<a href='http://www.blogjava.net/keweibo/articles/145535.html'>阅读全文</a><img src ="http://www.blogjava.net/keweibo/aggbug/145535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-09-16 14:52 <a href="http://www.blogjava.net/keweibo/articles/145535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的数据库事务管理</title><link>http://www.blogjava.net/keweibo/articles/145533.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sun, 16 Sep 2007 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/145533.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/145533.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/145533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/145533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/145533.html</trackback:ping><description><![CDATA[<div>
<p style="margin: 0cm 0cm 0pt 24pt; text-indent: -24pt; tab-stops: list 24.0pt"><strong><span style="font-size: 12pt">一、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 12pt; font-family: 宋体">数据库事务概念</span> </strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">数据库事务的特征：</span> <span style="font-size: 12pt">ACID</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">Atomic</span> <span style="font-size: 12pt; font-family: 宋体">（原子性）、</span> <span style="font-size: 12pt">Consistency</span> <span style="font-size: 12pt; font-family: 宋体">（一致性）、</span> <span style="font-size: 12pt">Isolation</span> <span style="font-size: 12pt; font-family: 宋体">（隔离性）和</span> <span style="font-size: 12pt">Durability</span> <span style="font-size: 12pt; font-family: 宋体">（持久性）。</span> <span style="font-size: 12pt">DBMS</span> <span style="font-size: 12pt; font-family: 宋体">用日志来保证数据的原子性、一致性和持久性；用锁的机制来保证数据的隔离性。</span> </p>
<p style="margin: 0cm 0cm 0pt 24pt; text-indent: -24pt; tab-stops: list 24.0pt"><strong><span style="font-size: 12pt">二、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 12pt; font-family: 宋体">事务的边界</span> </strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">数据库支持</span> <span style="font-size: 12pt">2</span> <span style="font-size: 12pt; font-family: 宋体">种事务模式：自动提交和手动提交。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">JDBC API</span> <span style="font-size: 12pt; font-family: 宋体">的事务边界</span> </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">try</span> <span style="color: #000000"><br />
<img id="Codehighlighter1_4_248_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_248_Open_Text.style.display='none'; Codehighlighter1_4_248_Closed_Image.style.display='inline'; Codehighlighter1_4_248_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /> <img id="Codehighlighter1_4_248_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_4_248_Closed_Text.style.display='none'; Codehighlighter1_4_248_Open_Image.style.display='inline'; Codehighlighter1_4_248_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /> </span><span id="Codehighlighter1_4_248_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;java.sql.DriverManager,.getConnection(dbUrl,dbUser,dbPwd);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;conn.setAutoCommit(</span> <span style="color: #0000ff">false</span> <span style="color: #000000">);&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;&nbsp;&nbsp;stmt&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;conn.createStatement();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;stmt.executeUpdate(</span> <span style="color: #000000">"</span> <span style="color: #000000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.</span> <span style="color: #000000">"</span> <span style="color: #000000">);&nbsp;</span> <span style="color: #008000">//</span> <span style="color: #008000">数据库更新1</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;&nbsp;&nbsp;stmt.executeUpdate(</span> <span style="color: #000000">"</span> <span style="color: #000000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.</span> <span style="color: #000000">"</span> <span style="color: #000000">);&nbsp;</span> <span style="color: #008000">//</span> <span style="color: #008000">数据库更新2</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;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;conn.commit();<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><span style="color: #0000ff">catch</span> <span style="color: #000000">(Exception&nbsp;e)<br />
<img id="Codehighlighter1_269_289_Open_Image" onclick="this.style.display='none'; Codehighlighter1_269_289_Open_Text.style.display='none'; Codehighlighter1_269_289_Closed_Image.style.display='inline'; Codehighlighter1_269_289_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_269_289_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_269_289_Closed_Text.style.display='none'; Codehighlighter1_269_289_Open_Image.style.display='inline'; Codehighlighter1_269_289_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span> <span id="Codehighlighter1_269_289_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;conn.rollback();<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><span style="color: #0000ff">finally</span> <span style="color: #000000"><br />
<img id="Codehighlighter1_299_331_Open_Image" onclick="this.style.display='none'; Codehighlighter1_299_331_Open_Text.style.display='none'; Codehighlighter1_299_331_Closed_Image.style.display='inline'; Codehighlighter1_299_331_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /> <img id="Codehighlighter1_299_331_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_299_331_Closed_Text.style.display='none'; Codehighlighter1_299_331_Open_Image.style.display='inline'; Codehighlighter1_299_331_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /> </span><span id="Codehighlighter1_299_331_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;stmt.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span> </span></div>
<span style="font-size: 12pt">
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">Hibernate API</span> <span style="font-size: 12pt; font-family: 宋体">声明事务边界</span> </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">Session&nbsp;session&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;factory.openSession();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />Transaction&nbsp;tx;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span> <span style="color: #0000ff">try</span> <span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_62_136_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_136_Open_Text.style.display='none'; Codehighlighter1_62_136_Closed_Image.style.display='inline'; Codehighlighter1_62_136_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_62_136_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_62_136_Closed_Text.style.display='none'; Codehighlighter1_62_136_Open_Image.style.display='inline'; Codehighlighter1_62_136_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span> <span id="Codehighlighter1_62_136_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;tx&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;session.beginTransaction();&nbsp;</span> <span style="color: #008000">//</span> <span style="color: #008000">开始事务<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&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;&nbsp;&nbsp;。。。。。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;tx.commit();<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><span style="color: #0000ff">catch</span> <span style="color: #000000">&nbsp;(Exception&nbsp;e)<br />
<img id="Codehighlighter1_158_198_Open_Image" onclick="this.style.display='none'; Codehighlighter1_158_198_Open_Text.style.display='none'; Codehighlighter1_158_198_Closed_Image.style.display='inline'; Codehighlighter1_158_198_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_158_198_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_158_198_Closed_Text.style.display='none'; Codehighlighter1_158_198_Open_Image.style.display='inline'; Codehighlighter1_158_198_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span> <span id="Codehighlighter1_158_198_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">if</span> <span style="color: #000000">&nbsp;(tx</span> <span style="color: #000000">!=</span> <span style="color: #0000ff">null</span> <span style="color: #000000">)<br />
<img id="Codehighlighter1_176_196_Open_Image" onclick="this.style.display='none'; Codehighlighter1_176_196_Open_Text.style.display='none'; Codehighlighter1_176_196_Closed_Image.style.display='inline'; Codehighlighter1_176_196_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_176_196_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_176_196_Closed_Text.style.display='none'; Codehighlighter1_176_196_Open_Image.style.display='inline'; Codehighlighter1_176_196_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span> <span id="Codehighlighter1_176_196_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;tx.rollback();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span> </span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /> </span><span style="color: #0000ff">finally</span> <span style="color: #000000"><br />
<img id="Codehighlighter1_208_228_Open_Image" onclick="this.style.display='none'; Codehighlighter1_208_228_Open_Text.style.display='none'; Codehighlighter1_208_228_Closed_Image.style.display='inline'; Codehighlighter1_208_228_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /> <img id="Codehighlighter1_208_228_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_208_228_Closed_Text.style.display='none'; Codehighlighter1_208_228_Open_Image.style.display='inline'; Codehighlighter1_208_228_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /> </span><span id="Codehighlighter1_208_228_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span> </span></div>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">注：一个</span> <span style="font-size: 12pt"><font face="Times New Roman">session</font> </span><span style="font-size: 12pt; font-family: 宋体">可以对应多个事务，但是推荐的做法是一个</span> <span style="font-size: 12pt"><font face="Times New Roman">session</font> </span><span style="font-size: 12pt; font-family: 宋体">对应一个事务。</span> </p>
<p style="margin: 0cm 0cm 0pt 24pt; text-indent: -24pt; tab-stops: list 24.0pt"><strong><span style="font-size: 12pt"><font face="Times New Roman"><span style="font: 7pt 'Times New Roman'"><strong><font size="3">三、</font> </strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></strong><strong><span style="font-size: 12pt; font-family: 宋体">多事务的并发问题</span> </strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">当多个事务同时访问相同的数据的时候，程序如果没有采取适当的隔离措施，就会发生数据库的并发问题。常见的并发问题有：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">第一类丢失更新：撤消事务的时候，把其他的事务已经提交的数据给覆盖了；</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">脏读；读了没有提交的数据；</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">虚读：一个事务读到另外一个事务已经提交的新插入的数据；</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">不可重复读：一个事务读到另外一个事务已经提交的更新的数据；</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">第二类丢失更新：一个事务覆盖另外一个事务已经提交的更新数据。</span>&nbsp;<br />
<strong>四、</strong><strong><span style="font-size: 12pt"><font face="Times New Roman"><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></strong><strong><span style="font-size: 12pt; font-family: 宋体">锁</span></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">一般地，大型的</span> <span style="font-size: 12pt"><font face="Times New Roman">DBMS</font> </span><span style="font-size: 12pt; font-family: 宋体">都会自动的管理锁定机制，但是在对数据的安全性、完整性和一致性有特殊要求的地方，可以由事务本身来管理琐的机制。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">有一点要关注的是：锁的粒度越大，隔离性越好，并发性越差。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">按照锁的程度来分有：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">共享锁：用读操作，非独占的，其他事务可以读，但是不能更新，并发性好；</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">独占锁：用与</span> <span style="font-size: 12pt"><font face="Times New Roman">insert update </font></span><span style="font-size: 12pt; font-family: 宋体">和</span> <span style="font-size: 12pt"><font face="Times New Roman">delete</font> </span><span style="font-size: 12pt; font-family: 宋体">等语句，其他事务不能读，也不能改，并发性差；</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">更新锁：执行</span> <span style="font-size: 12pt"><font face="Times New Roman">update</font> </span><span style="font-size: 12pt; font-family: 宋体">的时候，加锁。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">死琐：多是事务分别锁定了一个资源，又请求锁定对方已经锁定的资源，就造成了请求环。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">降低死锁的最好办法是使用短事务。</span> </p>
<p style="margin: 0cm 0cm 0pt 24pt; text-indent: -24pt; tab-stops: list 24.0pt"><strong><span style="font-size: 12pt"><font face="Times New Roman"><span style="font: 7pt 'Times New Roman'"><strong><font size="3">五、</font> </strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></strong><strong><span style="font-size: 12pt; font-family: 宋体">数据库的事务隔离级别</span> </strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">数据库提供</span> <span style="font-size: 12pt"><font face="Times New Roman">4</font> </span><span style="font-size: 12pt; font-family: 宋体">种事务隔离级别：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt"><font face="Times New Roman">Serializable</font> </span><span style="font-size: 12pt; font-family: 宋体">：串行化；（隔离级别最高）</span> <span style="font-size: 12pt"><font face="Times New Roman">1</font> </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt"><font face="Times New Roman">Repeatable Read</font> </span><span style="font-size: 12pt; font-family: 宋体">：可重复读；</span> <span style="font-size: 12pt"><font face="Times New Roman">2</font> </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt"><font face="Times New Roman">Read Commited</font> </span><span style="font-size: 12pt; font-family: 宋体">：读已提交数据；</span> <span style="font-size: 12pt"><font face="Times New Roman">4</font> </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt"><font face="Times New Roman">Read Uncommited</font> </span><span style="font-size: 12pt; font-family: 宋体">：读未提交数据；（隔离级别最低）</span> <span style="font-size: 12pt"><font face="Times New Roman">8</font> </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt"><font face="Times New Roman">Hiberate</font> </span><span style="font-size: 12pt; font-family: 宋体">中的隔离级别的设置</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">在</span> <span style="font-size: 12pt"><font face="Times New Roman">Hibernate</font> </span><span style="font-size: 12pt; font-family: 宋体">的配置文件中</span> <span style="font-size: 12pt"><font face="Times New Roman">hibernate.connection.isolation=2 </font></span></p>
<p style="margin: 0cm 0cm 0pt 24pt; text-indent: -24pt; tab-stops: list 24.0pt"><strong><span style="font-size: 12pt"><font face="Times New Roman"><span style="font: 7pt 'Times New Roman'"><strong><font size="3">六、</font> </strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></strong><strong><span style="font-size: 12pt; font-family: 宋体">悲观锁和乐观琐</span> </strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">从应用程序的角度来看，锁分为悲观锁和乐观锁。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">悲观锁：显示的为程序加锁，但是降低并发性。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt"><font face="Times New Roman">Select &#8230;&#8230;. For update;</font> </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">在</span> <span style="font-size: 12pt"><font face="Times New Roman">Hibernate</font> </span><span style="font-size: 12pt; font-family: 宋体">中的代码</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt"><font face="Times New Roman">Session.get(Account.class,net Long(1),LockMode.UPGRADE)</font> </span><span style="font-size: 12pt; font-family: 宋体">；</span> <span style="font-size: 12pt"><font face="Times New Roman">//</font> </span><span style="font-size: 12pt; font-family: 宋体">程序采用悲观锁</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">乐观锁：依靠</span> <span style="font-size: 12pt"><font face="Times New Roman">DBMS</font> </span><span style="font-size: 12pt; font-family: 宋体">来管理锁，程序依靠版本控制来避免并发问题。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">在对象</span> <span style="font-size: 12pt"><font face="Times New Roman">-</font> </span><span style="font-size: 12pt; font-family: 宋体">关系映射的文件中，用</span> <span style="font-size: 12pt"><font face="Times New Roman">&lt;version&gt;</font> </span><span style="font-size: 12pt; font-family: 宋体">或者</span> <span style="font-size: 12pt"><font face="Times New Roman">&lt;timestamp&gt;</font> </span><span style="font-size: 12pt; font-family: 宋体">可以管理并发。乐观琐比悲观琐有更好的并发性，优先考虑乐观琐。</span>&nbsp;<span style="font-size: 12pt"><font face="Times New Roman">&nbsp;<br />
<br />
</font> </span></p>
http://www.blogjava.net/sodmewuhan/archive/2006/04/22/42505.html</span></div>
<img src ="http://www.blogjava.net/keweibo/aggbug/145533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-09-16 14:50 <a href="http://www.blogjava.net/keweibo/articles/145533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的检索策略 </title><link>http://www.blogjava.net/keweibo/articles/145532.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sun, 16 Sep 2007 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/145532.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/145532.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/145532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/145532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/145532.html</trackback:ping><description><![CDATA[<div>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">Hibernate</span> <span style="font-size: 12pt; font-family: 宋体">提供了</span> <span style="font-size: 12pt">3</span> <span style="font-size: 12pt; font-family: 宋体">种检索策略：</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-size: 12pt; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体">延迟检索；</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-size: 12pt; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体">立即检索；</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-size: 12pt; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体">迫切左外连接；</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">Hibernate</span> <span style="font-size: 12pt; font-family: 宋体">提供</span> <span style="font-size: 12pt">2</span> <span style="font-size: 12pt; font-family: 宋体">种方式来确定检索策略，一中是在配置文件当中，另外一种是在程序种设置。当然，如果你在程序中设置了检索策略，那么你在配置文件中的设置也就无效了。另外的一种情况是</span> <span style="font-size: 12pt">HQL</span> <span style="font-size: 12pt; font-family: 宋体">会忽略配置文件的设置，而总是采用迫切左外连接。</span> </p>
<p style="margin: 0cm 0cm 0pt 24pt; text-indent: -24pt; tab-stops: list 24.0pt"><span style="font-size: 12pt">一、 </span><span style="font-size: 12pt; font-family: 宋体">类级别的检索</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">可以选择的检索策略是立即检索和延迟检索，默认的是立即检索。用配置文件中的</span> <span style="font-size: 12pt">&lt;class&gt;</span> <span style="font-size: 12pt; font-family: 宋体">节点的</span> <span style="font-size: 12pt">lazy</span> <span style="font-size: 12pt; font-family: 宋体">来控制。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">注意：不管你在配置</span> <span style="font-size: 12pt">class</span> <span style="font-size: 12pt; font-family: 宋体">的</span> <span style="font-size: 12pt">lazy</span> <span style="font-size: 12pt; font-family: 宋体">是</span> <span style="font-size: 12pt">true</span> <span style="font-size: 12pt; font-family: 宋体">还是</span> <span style="font-size: 12pt">false</span> <span style="font-size: 12pt; font-family: 宋体">，对</span> <span style="font-size: 12pt">get()</span> <span style="font-size: 12pt; font-family: 宋体">和</span> <span style="font-size: 12pt">create</span> <tt><span style="font-size: 9pt">Criteria</span> </tt><span style="font-size: 12pt">()</span> <span style="font-size: 12pt; font-family: 宋体">方法都不起作用，只有对</span> <span style="font-size: 12pt">load()</span> <span style="font-size: 12pt; font-family: 宋体">方法起作用。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">当你使用的检索策略是</span> <span style="font-size: 12pt">lazy</span> <span style="font-size: 12pt; font-family: 宋体">的时候，当你执行</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">Customer customer = (Customer)session.load(Customer.class,new Long(1));</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">的时候，</span> <span style="font-size: 12pt">Hibernate </span><span style="font-size: 12pt; font-family: 宋体">不从数据库检索数据，而只是产生一个代理类，只有当你执行</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">Customer.getName();</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">的时候，</span> <span style="font-size: 12pt">Hibernate</span> <span style="font-size: 12pt; font-family: 宋体">才到数据库取数据。所以，如下的代码是会被抛出异常的：</span> </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">Session&nbsp;session&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;sessionFactory.openSession();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />transaction&nbsp;tx&nbsp;</span> <span style="color: #000000">=</span> &nbsp; <span style="color: #0000ff">null</span> <span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />tx&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;session.beginTransaction();<br />
&nbsp; Customer&nbsp;customer&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;(Customer)session.load(Customer.</span> <span style="color: #0000ff">class</span> <span style="color: #000000">,</span> <span style="color: #0000ff">new</span> <span style="color: #000000">&nbsp;Long(</span> <span style="color: #000000">1</span> <span style="color: #000000">));<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />tx.commit();<br />
&nbsp; session.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />customer.getName();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span> </div>
<span style="font-size: 12pt">
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">get()</span> <span style="font-size: 12pt; font-family: 宋体">方法总是用的立即检索，如果和它相关联的类也是用的立即检索，那么也会把相关联的数据也检索出来。</span> </p>
<p style="margin: 0cm 0cm 0pt 24pt; text-indent: -24pt; tab-stops: list 24.0pt"><span style="font-size: 12pt">二、 </span><span style="font-size: 12pt; font-family: 宋体">一对和多对多关联检索</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">一般地，为了有减少对数据库的访问，我们往往用延迟检索的策略。所以，我们优先使用如下方式；</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">&lt;set class=&#8221;order&#8221; inverse=&#8221;true&#8217; lazy=&#8221;true&#8221; &gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">但是，我们在检索&#8220;多&#8221;的一方的时候，</span> <span style="font-size: 12pt">Hibernate</span> <span style="font-size: 12pt; font-family: 宋体">不能为我们产生代理类。由此，我们就要用</span> <span style="font-size: 12pt">betch-size</span> <span style="font-size: 12pt; font-family: 宋体">的配置来减少</span> <span style="font-size: 12pt">SQL</span> <span style="font-size: 12pt; font-family: 宋体">语句。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">当我们使用</span> <span style="font-size: 12pt">outer-join</span> <span style="font-size: 12pt; font-family: 宋体">属性的时候，我们就没有必要使用</span> <span style="font-size: 12pt">lazy</span> <span style="font-size: 12pt; font-family: 宋体">属性了。</span> <span style="font-size: 12pt">Outer-join</span> <span style="font-size: 12pt; font-family: 宋体">会一次将&#8220;一&#8221;方和与之相关的&#8220;多&#8221;方用左外连接的方式检索出来。</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 66pt"><span style="font-size: 12pt">Session session = sessionFactory.openSession();</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transaction tx = null;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;tx = session.beginTransaction();</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customer customer = (Customer)session.get(Customer.class,new Long(1));</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体">产生的</span> <span style="font-size: 12pt">SQL</span> <span style="font-size: 12pt; font-family: 宋体">语句如下：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; background: white; color: black; font-family: 'Courier New'">Hibernate: select customer0_.ID as ID1_, customer0_.NAME as NAME2_1_, orders1_.CUSTOMER_ID as CUSTOMER3_3_, orders1_.ID as ID3_, orders1_.ID as ID0_, orders1_.ORDER_NUMBER as ORDER2_1_0_, orders1_.CUSTOMER_ID as CUSTOMER3_1_0_ from sampledb.customers customer0_ left outer join sampledb.orders orders1_ on customer0_.ID=orders1_.CUSTOMER_ID where customer0_.ID=?</span> </p>
</span></div>
<img src ="http://www.blogjava.net/keweibo/aggbug/145532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-09-16 14:48 <a href="http://www.blogjava.net/keweibo/articles/145532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中使用过滤器完成事务处理</title><link>http://www.blogjava.net/keweibo/articles/141088.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Wed, 29 Aug 2007 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/141088.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/141088.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/141088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/141088.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/141088.html</trackback:ping><description><![CDATA[<p><span style="COLOR: #3366ff">实现的功能:&nbsp;&nbsp;&nbsp;通过Hibernate的工具类得到一个全局唯一的SessionFactory对象<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;通过SessionFactory对象得到Session对象,然后开始一个新的事务<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;通过chain对象的doFilter()方法来完成业务处理<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><br>HibernateFilter.java</p>
<p>import java.io.IOException;</p>
<p>import javax.servlet.Filter;<br>import javax.servlet.FilterChain;<br>import javax.servlet.FilterConfig;<br>import javax.servlet.ServletException;<br>import javax.servlet.ServletRequest;<br>import javax.servlet.ServletResponse;<br>import javax.servlet.http.HttpServletRequest;</p>
<p>import org.apache.commons.logging.Log;<br>import org.apache.commons.logging.LogFactory;<br>import org.hibernate.SessionFactory;</p>
<p>import cn.hxex.blog.hibernate.HibernateUtil;<br><br>public class HibernateFilter implements Filter {</p>
<p>&nbsp;&nbsp;&nbsp; private static Log log = LogFactory.getLog(HibernateFilter.class);</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 过滤器的主要方法<br>&nbsp;&nbsp;&nbsp;&nbsp; * 用于实现Hibernate事务的开始和提交<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public void doFilter(ServletRequest request,<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; ServletResponse response,<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; FilterChain chain)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException, ServletException <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;// 得到SessionFactory对象的实例<br>&nbsp;&nbsp;&nbsp; &nbsp;SessionFactory sf = HibernateUtil.getSessionFactory();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// 开始一个新的事务<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("Starting a database transaction");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sf.getCurrentSession().beginTransaction();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug( "Request Path:\t" + ((HttpServletRequest)request).getServletPath() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Call the next filter (continue request processing)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chain.doFilter(request, response);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 提交事务<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("Committing the database transaction");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sf.getCurrentSession().getTransaction().commit();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Throwable ex) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;ex.printStackTrace();<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; {<br>&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; log.debug("Trying to rollback database transaction after exception");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sf.getCurrentSession().getTransaction().rollback();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Throwable rbEx) <br>&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; log.error("Could not rollback transaction after exception!", rbEx);<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; // 抛出异常<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new ServletException(ex);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * Servlet过滤器的初始化方法<br>&nbsp;&nbsp;&nbsp;&nbsp; * 可以读取配置文件中设置的配置参数<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public void init(FilterConfig filterConfig) throws ServletException {}</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * Servlet的销毁方法<br>&nbsp;&nbsp;&nbsp;&nbsp; * 用于释放过滤器所申请的资源<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public void destroy() {}</p>
<p>}<br></p>
<img src ="http://www.blogjava.net/keweibo/aggbug/141088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-08-29 21:29 <a href="http://www.blogjava.net/keweibo/articles/141088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个公共的实体对象基类</title><link>http://www.blogjava.net/keweibo/articles/141067.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Wed, 29 Aug 2007 11:48:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/141067.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/141067.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/141067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/141067.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/141067.html</trackback:ping><description><![CDATA[<p><span style="COLOR: #000000">在建立实体对象之前,可以先实现一个公共的实体对象基类.在这个基类对象中可以包含代表每一个实体对象唯一的<br>标识 id 属性,以及一些公用的方法.具体如下<br><br><span style="COLOR: #ff0000">BaseModel.java</span></span></p>
<p>import java.io.Serializable;</p>
<p>import org.apache.commons.lang.builder.EqualsBuilder;<br>import org.apache.commons.lang.builder.HashCodeBuilder;<br>import org.apache.commons.lang.builder.ReflectionToStringBuilder;</p>
<p>public class BaseModel implements Serializable{</p>
<p>&nbsp;/**<br>&nbsp; * The Generated SerialVersionUID<br>&nbsp; */<br>&nbsp;private static final long serialVersionUID = 7766184319541530720L;<br>&nbsp;<br>&nbsp;/**<br>&nbsp; * The identify of the object<br>&nbsp; */<br>&nbsp;private String id;</p>
<p>&nbsp;public String getId() {<br>&nbsp;&nbsp;return id;<br>&nbsp;}</p>
<p>&nbsp;public void setId(String id) {<br>&nbsp;&nbsp;this.id = id;<br>&nbsp;}<br>&nbsp;<br>&nbsp;/**<br>&nbsp; * Common implement equals method<br>&nbsp; */<br>&nbsp;public boolean equals( Object obj )<br>&nbsp;{<br>&nbsp;&nbsp;if( this==obj ) return true;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;if( !( obj instanceof BaseModel ) )<br>&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;BaseModel target = (BaseModel)obj;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;if( this.getId()!=null &amp;&amp; this.getId().length()&gt;0 )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;return this.getId().equals( target.getId() );<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;if( target.getId()!=null &amp;&amp; target.getId().length()&gt;0 )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;return EqualsBuilder.reflectionEquals(this, obj);<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * Generate the hash code<br>&nbsp; */<br>&nbsp;public int hashCode()<br>&nbsp;{<br>&nbsp;&nbsp;if( this.getId()!=null &amp;&amp; this.getId().length()&gt;0 )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;return this.getId().hashCode();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;return HashCodeBuilder.reflectionHashCode(this);<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * Common implement toString method<br>&nbsp; */<br>&nbsp;public String toString()<br>&nbsp;{<br>&nbsp;&nbsp;return ReflectionToStringBuilder.toString( this );<br>&nbsp;}<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff00ff">equals()方法,用于判断两个对象是否相等,但并不是在使用"=="进行两个对象是否相等的判断时调用.因为使用"=="所判断的是两个对象的引用是否相等,也可以简单理解为两个实例所引用的是否为内存中的同一个对象.equals()方法可以理解为两个对象在"含义"上是否相等,也就是说这两个对象所表达的意思是否相同.equals()方法在对象保存到集合容器类(Collection)中时被调用.因为集合容器类不允许其中存在两个相同对象实例,其判断的依据就是通过调用该实体对象的equals()方法来进行判断的.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果修改了equals()方法,就必须修改hashCode()方法.如果不这样的话,就违反java.lang.Object的通用的hashCode的约定,从而导致该类无法与基于散列值的集合类一起正常工作.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toString()方法,用于将当前Java对象的实例转换为可以描述其内容的字符串.这个方法的作用是在程序调试的过程可以方便地得到实体对象中令人感兴趣的信息,有利于更准确及时地发现程序中的问题.<br></span></p>
<img src ="http://www.blogjava.net/keweibo/aggbug/141067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-08-29 19:48 <a href="http://www.blogjava.net/keweibo/articles/141067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 的工具类</title><link>http://www.blogjava.net/keweibo/articles/141061.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Wed, 29 Aug 2007 11:12:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/141061.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/141061.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/141061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/141061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/141061.html</trackback:ping><description><![CDATA[<p><strong style="COLOR: red">Hibernate 的工具类</strong></p>
<p>&nbsp;&nbsp;对于Hibernate 3.1 以前的的版本在实现Hibernate工具类时,需要通过两个线程<br>局部变量来保存与当前进行相对应的Session和事务对象的实例.<br>&nbsp;&nbsp;而对于Hibernate 3.1 以后的版本,使用线程局部变量保存Session和事务对象的<br>工作就完全不需要自己去实现了,只需在Hibernate.cfg.xml配置文件中增加一个名为<br><span style="COLOR: red">Current_session_context_class</span>的属性,并且设置该属性的值为<span style="COLOR: red">thread</span>.这样Hibernate<br>就可以自动地使用线程局部变量来保存当前的进程的Session和事务对象了.<br>&nbsp;&nbsp;相应地,Hibernate也为其Session对象增加了getTransaction()方法,以便可以随时<br>得到当前的事务并进行提交或者回滚操作.这个方法在以前版本的hibernate中是不存在<br>的.<br>Hibernate工具类主要包括以下功能:<br><strong><em>(1)Hibernate的初始化操作</em></strong><br>&nbsp;&nbsp;这个功能不放在任何方法中,采用静态编码的处理方式,在对象的初始化的时候被<br>&nbsp;&nbsp;调用一次就可以了.<br><strong><em>(2)得到当前的配置信息</em></strong><br>&nbsp;&nbsp;这个方法可以得到当前的配置信息,以便于动态进行配置参数的修改.hibernate<br>&nbsp;&nbsp;的配置信息只在Hibernate初始化的时候使用一次,在完成初始化之后对配置文件<br>&nbsp;&nbsp;或者Configuration对象所做的修改将不会生效.<br><strong><em>(3)得到SessionFactory对象的实例</em></strong><br>&nbsp;&nbsp;这个方法用于得到当前系统运行时的SessionFactory对象的实例,这个对象的实例<br>&nbsp;&nbsp;对于整个系统而言是全局唯一的.<br><strong><em>(4)释放各种资源</em></strong><br>&nbsp;&nbsp;这个方法用于终止Hibernate的报务后,释放各种Hibernate所使用的资源.虽然这个<br>&nbsp;&nbsp;方法几乎不会用到,但对于申请资源的及时释放是每个程序应该掌握的基本原则.<br><strong><em>(5)重建SessionFactory</em></strong><br>&nbsp;&nbsp;由于SessionFactory对于整个Hibernate应用是唯一的.并且是在Hibernate初始化<br>&nbsp;&nbsp;之后建立好的,而且对于配置文件的修改也不会影响到已经初始化的SessionFactory<br>&nbsp;&nbsp;对象.那么如何才能使修改的配置信息对Hibernate起作用呢.这就需要重建SessionFactory<br>&nbsp;&nbsp;对象实例.<br><strong><em>(6)拦截器注册</em></strong><br>&nbsp;&nbsp;用于注册拦截器并重建SessionFactory.<br><span style="COLOR: red">HibenateUtil.java</span><br>import javax.naming.InitialContext;<br>import javax.naming.NamingException;</p>
<p>import org.apache.commons.logging.Log;<br>import org.apache.commons.logging.LogFactory;<br>import org.hibernate.Interceptor;<br>import org.hibernate.SessionFactory;<br>import org.hibernate.cfg.Configuration;<br>import org.hibernate.cfg.Environment;</p>
<p><br>/**<br>&nbsp;* 基础的Hibernate辅助类，用于Hibernate的配置和启动。<br>&nbsp;* &lt;p&gt;<br>&nbsp;* 通过静态的初始化代码来读取Hibernate启动参数，并初始化<br>&nbsp;* &lt;tt&gt;Configuration&lt;/tt&gt;和&lt;tt&gt;SessionFactory&lt;/tt&gt;对象。<br>&nbsp;* &lt;p&gt;<br>&nbsp;*<br>&nbsp;* @author galaxy<br>&nbsp;*/<br>public class HibernateUtil <br>{</p>
<p>&nbsp;&nbsp;&nbsp; private static Log log = LogFactory.getLog(HibernateUtil.class);</p>
<p>&nbsp;&nbsp;&nbsp; // 指定定义拦截器属性名<br>&nbsp;&nbsp;&nbsp; private static final String INTERCEPTOR_CLASS = "hibernate.util.interceptor_class";</p>
<p>&nbsp;&nbsp;&nbsp; // 静态Configuration和SessionFactory对象的实例（全局唯一的）<br>&nbsp;&nbsp;&nbsp; private static Configuration configuration;<br>&nbsp;&nbsp;&nbsp; private static SessionFactory sessionFactory;</p>
<p>&nbsp;&nbsp;&nbsp; static <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 从缺省的配置文件创建SessionFactory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// 创建默认的Configuration对象的实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// 如果你不使用JDK 5.0或者注释请使用new Configuration()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// 来创建Configuration()对象的实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configuration = new Configuration();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 读取hibernate.properties或者hibernate.cfg.xml文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configuration.configure();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果在配置文件中配置了拦截器，那么将其设置到configuration对象中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String interceptorName = configuration.getProperty(INTERCEPTOR_CLASS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (interceptorName != null) <br>&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; Class interceptorClass =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.class.getClassLoader().loadClass(interceptorName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Interceptor interceptor = (Interceptor)interceptorClass.newInstance();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configuration.setInterceptor(interceptor);<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; if (configuration.getProperty(Environment.SESSION_FACTORY_NAME) != null) <br>&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; // 让Hibernate将SessionFacory绑定到JNDI<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configuration.buildSessionFactory();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&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; // 使用静态变量来保持SessioFactory对象的实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory = configuration.buildSessionFactory();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Throwable ex) <br>&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;&nbsp;&nbsp;&nbsp;&nbsp; log.error("Building SessionFactory failed.", ex);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new ExceptionInInitializerError(ex);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 返回原始的Configuration对象的实例<br>&nbsp;&nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp;&nbsp; * @return Configuration<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public static Configuration getConfiguration() <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return configuration;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 返回全局的SessionFactory对象的实例<br>&nbsp;&nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp;&nbsp; * @return SessionFactory<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public static SessionFactory getSessionFactory() <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionFactory sf = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sfName = configuration.getProperty(Environment.SESSION_FACTORY_NAME);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( sfName != null) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("Looking up SessionFactory in JNDI.");<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; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sf = (SessionFactory) new InitialContext().lookup(sfName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (NamingException ex) <br>&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; throw new RuntimeException(ex);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sf = sessionFactory;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (sf == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalStateException( "SessionFactory not available." );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sf;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 关闭当前的SessionFactory并且释放所有的资源<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public static void shutdown() <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("Shutting down Hibernate.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Close caches and connection pools<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getSessionFactory().close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Clear static variables<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configuration = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory = null;<br>&nbsp;&nbsp;&nbsp; }</p>
<p><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 使用静态的Configuration对象来重新构建SessionFactory。<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp; public static void rebuildSessionFactory() <br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("Using current Configuration for rebuild.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rebuildSessionFactory(configuration);<br>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 使用指定的Configuration对象来重新构建SessionFactory对象。<br>&nbsp;&nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp;&nbsp; * @param cfg<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp; public static void rebuildSessionFactory(Configuration cfg) <br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("Rebuilding the SessionFactory from given Configuration.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized(sessionFactory) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (sessionFactory != null &amp;&amp; !sessionFactory.isClosed())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cfg.getProperty(Environment.SESSION_FACTORY_NAME) != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.buildSessionFactory();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory = cfg.buildSessionFactory();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configuration = cfg;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 在当前SessionFactory中注册一个拦截器<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public static SessionFactory registerInterceptorAndRebuild(Interceptor interceptor) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("Setting new global Hibernate interceptor and restarting.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configuration.setInterceptor(interceptor);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rebuildSessionFactory();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getSessionFactory();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 获得拦截器对象<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @return Interceptor<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public static Interceptor getInterceptor() <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return configuration.getInterceptor();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 提交当前事务，并开始一个新的事务<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public static void commitAndBeginTransaction()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;sessionFactory.getCurrentSession().getTransaction().commit();<br>&nbsp;&nbsp;&nbsp; &nbsp;sessionFactory.getCurrentSession().beginTransaction();<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/141061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-08-29 19:12 <a href="http://www.blogjava.net/keweibo/articles/141061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>