﻿<?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-负人博客-文章分类-软件设计</title><link>http://www.blogjava.net/cader/category/12840.html</link><description>要想负多生孩子少种树</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 02:42:41 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 02:42:41 GMT</pubDate><ttl>60</ttl><item><title>CreateDAO_zh</title><link>http://www.blogjava.net/cader/articles/57003.html</link><dc:creator>负人博客</dc:creator><author>负人博客</author><pubDate>Thu, 06 Jul 2006 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/cader/articles/57003.html</guid><wfw:comment>http://www.blogjava.net/cader/comments/57003.html</wfw:comment><comments>http://www.blogjava.net/cader/articles/57003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cader/comments/commentRss/57003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cader/services/trackbacks/57003.html</trackback:ping><description><![CDATA[
		<p>
				<b>Part I:</b>
				<a class="wikipage" href="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/Wiki.jsp?page=CreateDAO_zh">&amp;#22312;AppFuse&amp;#24314;&amp;#31435;DAO&amp;#21644;&amp;#23545;&amp;#35937;</a> - 一个建立对象(代表数据库的表)和把这些对象存储到数据库的Java类的教程。 
</p>
		<h3 id="section-CreateDAO_zh-2085120110264122594531243">关于本教程</h3>本教程将向你展示如何在一个数据库里创建表，以及如何完成访问这些表的Java代码。 
<p>我们将建立一个对象以及处理（保存/检索/删除）这些类到数据库的一些代码。用Java术语，我们叫它Plain Old Java Object(a.k.a. a <a class="external" href="http://forum.java.sun.com/thread.jsp?forum=92&amp;thread=425300&amp;tstart=0&amp;trange=15">POJO</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />)。这个对象通常代表了数据库中的一个表，<i>其他的类</i>包括: </p><ul><li>一个数据访问对象Data Access Object (a.k.a. a <a class="external" href="http://java.sun.com/blueprints/patterns/DAO.html">DAO</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />), 一个 <a class="external" href="http://java.sun.com/docs/books/tutorial/java/concepts/interface.html">Interface</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />和一个Hibernate实现 
</li><li>一个 <a class="external" href="http://www.junit.org/">JUnit</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" /> 类来测试我们的DAO对象 </li></ul><span class="note"><b>NOTE:</b> 如果你使用MySQL并且希望使用事务 (很有可能是这个情况),你需要使用InnoDB tables，为了做到这一点, 添加以下两句话到 (<tt>/etc/my.cnf</tt> 或者 <tt>c:\Windows\my.ini</tt>)。 其中第二个设置 (设置使用UTF-8字符)是4.1.7+所必需的。 <pre>[mysqld]
default-table-type=innodb
default-character-set=utf8
</pre>如果你使用PostgreSQL并且在成批处理时得到许多迷惑的错误，试着把关闭它，方法是增加 <tt>&lt;prop key="hibernate.jdbc.batch_size"&gt;0&lt;/prop&gt;</tt> 到你的 <tt>src/dao/**/hibernate/applicationContext-hibernate.xml</tt>文件。 </span><p>AppFuse使用<a class="external" href="http://www.hibernate.org/">Hibernate</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" /> 作为持久化层， Hibernate是一套对象/关系Object/Relational (O/R)框架，他允许你把Java对象和数据库之间联系起来，它可以很方便的对你的对象执行CRUD (Create, Retrieve, Update, Delete)操作。 </p><dl><dt></dt><dd><i>你也可以选择使用<a class="external" href="http://ibatis.com/">iBATIS</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />作为持久化层，如果要在AppFuse里安装iBATIS， 请查看<tt>extras/ibatis</tt>中的README.txt。如果你选择iBATIS而不是Hibernate， 希望你有自己的原因并且熟悉这个框架，我也希望你能够领会到如何将教程应用到iBATIS ;-)</i></dd></dl><h4 id="section-CreateDAO_zh-23383203072481520363368273489220013">字体惯例 (进行中)</h4><dl><dt></dt><dd>要在命令行下执行的命令是这个样子: <b>ant test-all</b>. </dd></dl><dl><dt></dt><dd>对目录或者包中的文件的引用是这个样子: <font size="2"><tt>build.xml</tt></font>. </dd></dl><dl><dt></dt><dd><span style="COLOR: blue"><i>我在真实世界中实际操作的方式用蓝色斜体表示。</i></span></dd></dl><p>让我们继续在AppFuse项目的结构下创建一个新的对象、DAO和测试。 </p><h4 id="section-CreateDAO_zh-3044624405">目录</h4><ul><li><a class="footnoteref" href="http://raibledesigns.com/wiki/Wiki.jsp?page=CreateDAO_zh#ref-CreateDAO_zh-1">[1]</a> 建立一个对象，并且作<a class="external" href="http://xdoclet.sf.net/">XDoclet</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />标记 
</li><li><a class="footnoteref" href="http://raibledesigns.com/wiki/Wiki.jsp?page=CreateDAO_zh#ref-CreateDAO_zh-2">[2]</a> 使用Ant根据对象建立数据库中的表 
</li><li><a class="footnoteref" href="http://raibledesigns.com/wiki/Wiki.jsp?page=CreateDAO_zh#ref-CreateDAO_zh-3">[3]</a> 创建一个DaoTest来运行DAO对象的JUnit测试 
</li><li><a class="footnoteref" href="http://raibledesigns.com/wiki/Wiki.jsp?page=CreateDAO_zh#ref-CreateDAO_zh-4">[4]</a> 创建一个新的DAO来执行关于这个对象的CRUD操作 
</li><li><a class="footnoteref" href="http://raibledesigns.com/wiki/Wiki.jsp?page=CreateDAO_zh#ref-CreateDAO_zh-5">[5]</a> 在spring里配置Person和PersonDao 
</li><li><a class="footnoteref" href="http://raibledesigns.com/wiki/Wiki.jsp?page=CreateDAO_zh#ref-CreateDAO_zh-6">[6]</a> 运行DaoTest </li></ul><h3 id="section-CreateDAO_zh-24314314351996820010235453593765292241821998820316XDoclet26631357601">建立一个对象，并且作XDoclet标记 <a class="footnote" name="ref-CreateDAO_zh-1">[#1]</a></h3><p>我们要做的第一件事情就是建立一个需要持久化的对象，我们要在<tt>src/dao/**/model</tt>目录下建立一个简单的Person对象，这个对象包括id、firstName和lastName属性。 </p><span class="note"><b>注意：</b> 直接拷贝本教程的代码 <a class="external" href="http://raibledesigns.com/page/rd?anchor=java2html_plugin_for_jspwiki_causes">&amp;#22312;FireFox&amp;#19979;&amp;#26080;&amp;#25928;</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />，但我们可以通过CTRL+Click选定一个代码所在的工作区(OS X下是Command+Click)，然后再拷贝。</span><p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#7f0055"><b>package </b></font><font color="#000000">org.appfuse.model;</font><br /><font color="#ffffff"></font><br /><font color="#7f0055"><b>public class </b></font><font color="#000000">Person </font><font color="#7f0055"><b>extends </b></font><font color="#000000">BaseObject </font><font color="#000000">{</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>private </b></font><font color="#000000">Long id;</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>private </b></font><font color="#000000">String firstName;</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>private </b></font><font color="#000000">String lastName;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#3f7f5f">/*</font><br /><font color="#ffffff">     </font><font color="#3f7f5f">Generate your getters and setters using your favorite IDE: </font><br /><font color="#ffffff">     </font><font color="#3f7f5f">In Eclipse:</font><br /><font color="#ffffff">     </font><font color="#3f7f5f">Right-click -&gt; Source -&gt; Generate Getters and Setters</font><br /><font color="#ffffff">    </font><font color="#3f7f5f">*/</font><br /><font color="#000000">}</font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><p>这个类必须扩展<a class="external" href="http://raibledesigns.com/downloads/appfuse/api/org/appfuse/model/BaseObject.java.html">BaseObject</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />，而这个BaseObject有三个抽象方法(equals(), hashCode()和toString())需要你在Person类里实现，前两个是Hibernate的需要。为了完成这部分工作最简单的方式是使用<a class="external" href="http://commonclipse.sf.net/">Commonclipse</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />，关于这个工具更多的信息可以在<a class="external" href="http://www.leegrey.com/hmm/2004/09/29/1096491256000.html">Lee Grey&amp;#30340;&amp;#32593;&amp;#31449;</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />里看到，另外一个你可以使用的Eclipse的插件是<a class="external" href="http://commons4e.berlios.de/">Commons4E</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />，我还没有使用过，这里不便对其功能作出评论。 </p><dl><dt></dt><dd><i>如果你使用<a class="external" href="http://www.jetbrains.com/idea">IntelliJ IDEA</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />，你可以自动产生equals()和hashCode()，但没有toString()，有一个 <a class="external" href="http://www.intellij.org/twiki/bin/view/Main/ToStringPlugin">ToStringPlugin</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />插件做得非常不错</i></dd></dl><p>现在我们已经创建了这个POJO对象，我们需要增加XDoclet标记来产生Hibernate的映射文件，这些文件用来映射对象→ 表和属性(变量) → 字段。 </p><p>首先，我们增加<a class="external" href="http://xdoclet.sourceforge.net/tags/hibernate-tags.html#@hibernate.class%20(0..1)">@hibernate.class</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" /> 来告诉Hibernate我们将要和那个表作关联： </p><p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#3f5fbf">/**</font><br /><font color="#ffffff"> </font><font color="#3f5fbf">* @hibernate.class table="person"</font><br /><font color="#ffffff"> </font><font color="#3f5fbf">*/</font><br /><font color="#7f0055"><b>public class </b></font><font color="#000000">Person </font><font color="#7f0055"><b>extends </b></font><font color="#000000">BaseObject </font><font color="#000000">{</font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><p>我们也要增加主键的映射,否则XDoclet会在产生映射文件时出错,注意所有的@hibernate.*标签必须在<b>getters'</b>的Javadocs里面。 </p><p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#3f5fbf">/**</font><br /><font color="#ffffff">     </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@return </font><font color="#3f5fbf">Returns the id.</font><br /><font color="#ffffff">     </font><font color="#3f5fbf">* @hibernate.id column="id"</font><br /><font color="#ffffff">     </font><font color="#3f5fbf">*  generator-class="increment" unsaved-value="null"</font><br /><font color="#ffffff">     </font><font color="#3f5fbf">*/</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#000000">Long getId</font><font color="#000000">() {</font><br /><font color="#ffffff">        </font><font color="#7f0055"><b>return this</b></font><font color="#000000">.id;</font><br /><font color="#ffffff">    </font><font color="#000000">}</font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><dl><dt></dt><dd><span style="COLOR: blue"><i>我使用<tt>generator-class="increment"</tt>而不使用<tt>generate-class="native"</tt> 是因为我对数据库使用"native"时<a class="wikipage" href="http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuseOnDB2">&amp;#21457;&amp;#29616;&amp;#20102;&amp;#19968;&amp;#20123;&amp;#38382;&amp;#39064;</a>，如果你只是希望使用MySQL，<b>推荐使用"native"值</b>，本教程使用increment。</i></span></dd></dl><p></p><h3 id="section-CreateDAO_zh-2035129992Ant266812545423545359372013529983259682545424211349202">使用Ant根据对象产生数据库表<a class="footnote" name="ref-CreateDAO_zh-2">[#2]</a></h3>在这种情况下,你可以通过运行<b>ant setup-db</b>来建立person表，这个任务会产生文件<tt>Person.hbm.xml</tt>并且会建立叫做"person"的表，从Ant的控制台窗口，你可以看到Hibernate为你建立的表结构的内容。 <pre>[schemaexport] create table person (
[schemaexport]    id bigint not null,
[schemaexport]    primary key (id)
[schemaexport] );
</pre><p>如果你查看Hibernate生成的文件<tt>Person.hbm.xml</tt>，可以到<tt>build/dao/gen/**/model</tt>目录，这里是<tt>Person.hbm.xml</tt>的内容(目前的内容): </p><p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#000000">&lt;?xml version=</font><font color="#2a00ff">"1.0"</font><font color="#000000">?&gt;</font><br /><font color="#ffffff"></font><br /><font color="#000000">&lt;!DOCTYPE hibernate-mapping PUBLIC</font><br /><font color="#ffffff">    </font><font color="#2a00ff">"-//Hibernate/Hibernate Mapping DTD 2.0//EN" </font><br /><font color="#ffffff">    </font><font color="#2a00ff">"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"</font><font color="#000000">&gt;</font><br /><font color="#ffffff"></font><br /><font color="#000000">&lt;hibernate-mapping&gt;</font><br /><font color="#ffffff">    </font><font color="#000000">&lt;</font><font color="#7f0055"><b>class</b></font><br /><font color="#ffffff">        </font><font color="#000000">name=</font><font color="#2a00ff">"org.appfuse.model.Person"</font><br /><font color="#ffffff">        </font><font color="#000000">table=</font><font color="#2a00ff">"person"</font><br /><font color="#ffffff">        </font><font color="#000000">dynamic-update=</font><font color="#2a00ff">"false"</font><br /><font color="#ffffff">        </font><font color="#000000">dynamic-insert=</font><font color="#2a00ff">"false"</font><br /><font color="#ffffff">    </font><font color="#000000">&gt;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#000000">&lt;id</font><br /><font color="#ffffff">            </font><font color="#000000">name=</font><font color="#2a00ff">"id"</font><br /><font color="#ffffff">            </font><font color="#000000">column=</font><font color="#2a00ff">"id"</font><br /><font color="#ffffff">            </font><font color="#000000">type=</font><font color="#2a00ff">"java.lang.Long"</font><br /><font color="#ffffff">            </font><font color="#000000">unsaved-value=</font><font color="#2a00ff">"null"</font><br /><font color="#ffffff">        </font><font color="#000000">&gt;</font><br /><font color="#ffffff">            </font><font color="#000000">&lt;generator </font><font color="#7f0055"><b>class</b></font><font color="#000000">=</font><font color="#2a00ff">"increment"</font><font color="#000000">&gt;</font><br /><font color="#ffffff">            </font><font color="#000000">&lt;/generator&gt;</font><br /><font color="#ffffff">        </font><font color="#000000">&lt;/id&gt;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#000000">&lt;!--</font><br /><font color="#ffffff">            </font><font color="#000000">To add non XDoclet property mappings, create a file named</font><br /><font color="#ffffff">                </font><font color="#000000">hibernate-properties-Person.xml</font><br /><font color="#ffffff">            </font><font color="#000000">containing the additional properties and place it in your merge dir.</font><br /><font color="#ffffff">        </font><font color="#000000">--&gt;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#000000">&lt;/</font><font color="#7f0055"><b>class</b></font><font color="#000000">&gt;</font><br /><font color="#ffffff"></font><br /><font color="#000000">&lt;/hibernate-mapping&gt;</font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><p>现在我们要为其它的字段(first_name, last_name)添加额外的<a class="external" href="http://xdoclet.sourceforge.net/tags/hibernate-tags.html#@hibernate.property%20(0..1)">@hibernate.property</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />标签： </p><p></p><p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#3f5fbf">/**</font><br /><font color="#ffffff">     </font><font color="#3f5fbf">* @hibernate.property column="first_name" length="50"</font><br /><font color="#ffffff">     </font><font color="#3f5fbf">*/</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#000000">String getFirstName</font><font color="#000000">() {</font><br /><font color="#ffffff">        </font><font color="#7f0055"><b>return this</b></font><font color="#000000">.firstName;</font><br /><font color="#ffffff">    </font><font color="#000000">}</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#3f5fbf">/**</font><br /><font color="#ffffff">     </font><font color="#3f5fbf">* @hibernate.property column="last_name" length="50"</font><br /><font color="#ffffff">     </font><font color="#3f5fbf">*/</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#000000">String getLastName</font><font color="#000000">() {</font><br /><font color="#ffffff">        </font><font color="#7f0055"><b>return this</b></font><font color="#000000">.lastName;</font><br /><font color="#ffffff">    </font><font color="#000000">}</font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><p>在这个例子里，添加<i>column</i>属性的唯一原因是因为这个字段名与它的属性名不相同，如果他们相同，你没有必要来指定<i>column</i>属性，关于其它可以使用的标签请看<a class="external" href="http://xdoclet.sourceforge.net/tags/hibernate-tags.html#@hibernate.property%20(0..1)">@hibernate.property</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />。 </p><p>再次运行<b>ant setup-db</b>把新加的属性加到数据库表里。 </p><pre>[schemaexport] create table person (
[schemaexport]    id bigint not null,
[schemaexport]    first_name varchar(50),
[schemaexport]    last_name varchar(50),
[schemaexport]    primary key (id)
[schemaexport] );</pre><p>如果期望修改字段的长度，修改@hibernate.property标签的<i>length</i>属性，如果希望把字段改为必添字段(NOT NULL)，可以增加属性not-null="true"。 </p><h3 id="section-CreateDAO_zh-24314314352603230340DaoTest26469235452032030340DAO3681634892JUnit27979357973">建立新的DaoTest来对你的DAO运行JUnit测试<a class="footnote" name="ref-CreateDAO_zh-3">[#3]</a></h3><span class="note"><a name="appgen"></a><b>注意:</b>从Appfuse版本1.6.1+开始包括了一个<a class="wikipage" href="http://raibledesigns.com/wiki/Wiki.jsp?page=AppGen">AppGen</a>工具，可以用来生成本教程余下的所有的类的代码，不过，我们最好还是先过一遍教程再使用这个工具产生代码。</span><p>现在，我们要创建一个DaoTest来测试我们的DAO的工作，等会儿，你说，我们还不曾创建DAO呢！，你说得对。无论如何，我发现<a class="external" href="http://www.artima.com/intv/testdriven.html">&amp;#27979;&amp;#35797;&amp;#39537;&amp;#21160;&amp;#24320;&amp;#21457;</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />大大的促进了软件质量，在许多年里我一直认为<b>在写代码之前写测试</b>是胡说八道，这看起来很愚蠢，但当我尝试之后我认为这样非常好，现在我按照测试驱动的方式工作完全因为我发现这样可以大大提高我软件开发的效率。 </p><p>开始，我们在<tt>test/dao/**/dao</tt>目录下建立类<tt>PersonDaoTest.java</tt>，这个类必须扩展<a class="external" href="http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDaoTestCase.java.html">BaseDaoTestCase</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />，而BaseDAOTestCase这个类是JUnit类<a class="external" href="http://junit.sourceforge.net/javadoc/junit/framework/TestCase.html">TestCase</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />的子类，这个类用来加载<a class="external" href="http://www.springframework.org/">Spring</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />的ApplicationContext（因为Spring把各个层绑定）和单元测试类同一目录下同你的测试类文件同名的.properties文件（ResourceBundle），这个属性文件的属性可以通过rb属性来访问。 </p><dl><dt></dt><dd><span style="COLOR: blue"><i>我经常拷贝(打开→另存为)一个已存在的测试(如UserDaoTest.java)，然后查找/替换 [Uu]ser为[Pp]erson，或者任何其它需要替换的内容。</i></span></dd></dl><p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#7f0055"><b>package </b></font><font color="#000000">org.appfuse.dao;</font><br /><font color="#ffffff"></font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">org.appfuse.model.Person;</font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">org.springframework.dao.DataAccessException;</font><br /><font color="#ffffff"></font><br /><font color="#7f0055"><b>public class </b></font><font color="#000000">PersonDaoTest </font><font color="#7f0055"><b>extends </b></font><font color="#000000">BaseDaoTestCase </font><font color="#000000">{</font><br /><font color="#ffffff">    </font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>private </b></font><font color="#000000">Person person = </font><font color="#7f0055"><b>null</b></font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>private </b></font><font color="#000000">PersonDao dao = </font><font color="#7f0055"><b>null</b></font><font color="#000000">;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">setPersonDao</font><font color="#000000">(</font><font color="#000000">PersonDao dao</font><font color="#000000">) {</font><br /><font color="#ffffff">        </font><font color="#7f0055"><b>this</b></font><font color="#000000">.dao = dao;</font><br /><font color="#ffffff">    </font><font color="#000000">}</font><br /><font color="#000000">}</font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><p>以上是我们使用JUnit测试而初始化和销毁PersonDao的基本代码，对象ctx引用了Spring的ApplicationContext，它在<a class="external" href="http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDaoTestCase.java.html">BaseDaoTestCase</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />类的静态代码区里被初始化。 </p><p>现在我们需要实际测试DAO中的CRUD(create, retrieve, update, delete)方法，为此我们需要为每个方法建立以test（全部小写）开头的测试方法，只要这个方法是公共的，返回类型是void,它们就会被我们build.xml中的Ant的&lt;junit&gt;任务调用，如下是一些简单的CRUD测试，需要注意的一点是所有的方法（或者叫做测试）必须是自治的，添加如下代码到文件<tt>PersonDaoTest.java</tt>： </p><p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">testGetPerson</font><font color="#000000">() </font><font color="#7f0055"><b>throws </b></font><font color="#000000">Exception </font><font color="#000000">{</font><br /><font color="#ffffff">        </font><font color="#000000">person = </font><font color="#7f0055"><b>new </b></font><font color="#000000">Person</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">person.setFirstName</font><font color="#000000">(</font><font color="#2a00ff">"Matt"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">person.setLastName</font><font color="#000000">(</font><font color="#2a00ff">"Raible"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#000000">dao.savePerson</font><font color="#000000">(</font><font color="#000000">person</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">assertNotNull</font><font color="#000000">(</font><font color="#000000">person.getId</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#000000">person = dao.getPerson</font><font color="#000000">(</font><font color="#000000">person.getId</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">assertEquals</font><font color="#000000">(</font><font color="#000000">person.getFirstName</font><font color="#000000">()</font><font color="#000000">, </font><font color="#2a00ff">"Matt"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#000000">}</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">testSavePerson</font><font color="#000000">() </font><font color="#7f0055"><b>throws </b></font><font color="#000000">Exception </font><font color="#000000">{</font><br /><font color="#ffffff">        </font><font color="#000000">person = dao.getPerson</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">Long</font><font color="#000000">(</font><font color="#990000">1</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">person.setFirstName</font><font color="#000000">(</font><font color="#2a00ff">"Matt"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#000000">person.setLastName</font><font color="#000000">(</font><font color="#2a00ff">"Last Name Updated"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#000000">dao.savePerson</font><font color="#000000">(</font><font color="#000000">person</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">log.isDebugEnabled</font><font color="#000000">()) {</font><br /><font color="#ffffff">            </font><font color="#000000">log.debug</font><font color="#000000">(</font><font color="#2a00ff">"updated Person: " </font><font color="#000000">+ person</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">}</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#000000">assertEquals</font><font color="#000000">(</font><font color="#000000">person.getLastName</font><font color="#000000">()</font><font color="#000000">, </font><font color="#2a00ff">"Last Name Updated"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#000000">}</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">testAddAndRemovePerson</font><font color="#000000">() </font><font color="#7f0055"><b>throws </b></font><font color="#000000">Exception </font><font color="#000000">{</font><br /><font color="#ffffff">        </font><font color="#000000">person = </font><font color="#7f0055"><b>new </b></font><font color="#000000">Person</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">person.setFirstName</font><font color="#000000">(</font><font color="#2a00ff">"Bill"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">person.setLastName</font><font color="#000000">(</font><font color="#2a00ff">"Joy"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#000000">dao.savePerson</font><font color="#000000">(</font><font color="#000000">person</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#000000">assertEquals</font><font color="#000000">(</font><font color="#000000">person.getFirstName</font><font color="#000000">()</font><font color="#000000">, </font><font color="#2a00ff">"Bill"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">assertNotNull</font><font color="#000000">(</font><font color="#000000">person.getId</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">log.isDebugEnabled</font><font color="#000000">()) {</font><br /><font color="#ffffff">            </font><font color="#000000">log.debug</font><font color="#000000">(</font><font color="#2a00ff">"removing person..."</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">}</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#000000">dao.removePerson</font><font color="#000000">(</font><font color="#000000">person.getId</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#7f0055"><b>try </b></font><font color="#000000">{</font><br /><font color="#ffffff">            </font><font color="#000000">person = dao.getPerson</font><font color="#000000">(</font><font color="#000000">person.getId</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#ffffff">            </font><font color="#000000">fail</font><font color="#000000">(</font><font color="#2a00ff">"Person found in database"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">} </font><font color="#7f0055"><b>catch </b></font><font color="#000000">(</font><font color="#000000">DataAccessException dae</font><font color="#000000">) {</font><br /><font color="#ffffff">            </font><font color="#000000">log.debug</font><font color="#000000">(</font><font color="#2a00ff">"Expected exception: " </font><font color="#000000">+ dae.getMessage</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#ffffff">            </font><font color="#000000">assertNotNull</font><font color="#000000">(</font><font color="#000000">dae</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">}</font><br /><font color="#ffffff">    </font><font color="#000000">}</font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><p></p><dl><dt></dt><dd><span style="COLOR: blue"><i>在testGetPerson方法，我们创建了一个person并且调用get方法，我通常会增加一条我所需要的记录到数据库，因为在测试运行之前<a class="external" href="http://www.dbunit.org/">DBUnit</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />会为数据库准备测试数据，我们可以简单的在metadata/sql/sample-data.xml里添加测试所必须的记录</i></span></dd></dl><p></p><div style="MARGIN-LEFT: 50px; COLOR: blue! important"><p></p><pre>&lt;table name='person'&gt;
    &lt;column&gt;id&lt;/column&gt;
    &lt;column&gt;first_name&lt;/column&gt;
    &lt;column&gt;last_name&lt;/column&gt;
    &lt;row&gt;
      &lt;value&gt;1&lt;/value&gt;
      &lt;value&gt;Matt&lt;/value&gt;
      &lt;value&gt;Raible&lt;/value&gt;
    &lt;/row&gt;
&lt;/table&gt;
</pre></div><dl><dt></dt><dd><span style="COLOR: blue"><i>通过这种方式你可以在testGetPerson方法里消除创建新纪录的动作，如果你愿意直接插入记录到数据库（使用SQL或者GUI），你可以用<b>ant db-export</b>和<b>cp <tt>db-export.xml metadata/sql/sample-data.xml</tt></b>重新构建你的<tt>sample-data.xml</tt>文件。</i></span></dd></dl><p>在上面的例子里，你可以看到我们调用person.set*(value)来准备我们需要保存的对象，在这个例子里很简单，但是当你要插入10条必添字段(not-null="true")时就比较麻烦了，这就是我为什么要在BaseDaoTestCase使用ResourceBundle文件，只要在<tt>PersonDaoTest.java</tt>同一个目录创建一个<tt>PersonDaoTest.properties</tt>并且在里面定义你的属性值： </p><dl><dt></dt><dd><span style="COLOR: blue"><i>我通常只是在Java里硬编码，但是这个.properties对于大对象很有用。</i></span></dd></dl><pre>firstName=Matt
lastName=Raible
</pre>此时，你要通过调用BaseDaoTestCase.populate(java.lang.Object)方法来准备对象，而不是使用person.set*。 
<p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#000000">person = </font><font color="#7f0055"><b>new </b></font><font color="#000000">Person</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#000000">person = </font><font color="#000000">(</font><font color="#000000">Person</font><font color="#000000">) </font><font color="#000000">populate</font><font color="#000000">(</font><font color="#000000">person</font><font color="#000000">)</font><font color="#000000">;</font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><p>在目前情况下，还不可以编译PersonDaoTest，因为在类路径里还没有PersonDao.class，我们需要创建它。PersonDao.java是一个接口，PersonDaoHibernate.java是它的Hibernate实现，让我们继续，开始创建。 </p><h3 id="section-CreateDAO_zh-210192431419968200102354523545359372519134892CRUD25805203163034026032DAO4">创建一个对对象执行CRUD操作的新DAO<a class="footnote" name="ref-CreateDAO_zh-4">[#4]</a></h3>马上，在<tt>src/dao/**/dao</tt>目录里建立PersonDao.java接口，并且指定所有实现类要实现的基本CRUD操作，为了显示方便，我已经去掉了所有JavaDocs。 
<p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#7f0055"><b>package </b></font><font color="#000000">org.appfuse.dao;</font><br /><font color="#ffffff"></font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">org.appfuse.model.Person;</font><br /><font color="#ffffff"></font><br /><font color="#7f0055"><b>public interface </b></font><font color="#000000">PersonDao </font><font color="#7f0055"><b>extends </b></font><font color="#000000">Dao </font><font color="#000000">{</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#000000">Person getPerson</font><font color="#000000">(</font><font color="#000000">Long personId</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">savePerson</font><font color="#000000">(</font><font color="#000000">Person person</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">removePerson</font><font color="#000000">(</font><font color="#000000">Long personId</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#000000">}</font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><p>注意，在以上的方法声明上并没有exceptions说明，这是因为<a class="external" href="http://www.springframework.org/">Spring</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />使用RuntimeExceptions来包裹Exceptions的方式，此时，你已经可以使用<b>ant compile-dao</b>来编译<tt>src/dao</tt>和<tt>test/dao</tt>下的所有源文件，然而当你运行<b>ant test-dao -Dtestcase=PersonDao</b>进行测试时，你会得到一个错误：<span style="COLOR: red">No bean named 'personDao' is defined</span>，这是一个Spring的错误，说明你必须在<tt>applicationContext-hibernate.xml</tt>指定一个名字为<i>personDAO</i>的bean，在此之前我们需要创建PersonDao的实现类。 </p><dl><dt></dt><dd><i>运行dao测试的ant任务叫做<b>test-dao</b>，如果你传递testcase参数(用<b>-Dtestcase=name</b>)，它会查看<tt>**/*${testcase}*</tt>允许我们传递Person、PersonDao、或者PersonDaoTest以及所有会执行PersonDaoTest的类。</i></dd></dl><p>让我们创建一个实现PersonDao的类PersonDaoHibernate并使用Hibernate来get/save/delete这个Person对象，为此，我们在<tt>src/dao/**/dao/hibernate</tt>创建一个新类<tt>PersonDaoHibernate.java</tt>，它应该扩展<a class="external" href="http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDAOHibernate.java.html">BaseDaoHibernate</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />，并且实现PersonDao。<i>为了简洁，省略Javadocs。</i></p><p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#7f0055"><b>package </b></font><font color="#000000">org.appfuse.dao.hibernate;</font><br /><font color="#ffffff"></font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">org.appfuse.model.Person;</font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">org.appfuse.dao.PersonDao;</font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">org.springframework.orm.ObjectRetrievalFailureException;</font><br /><font color="#ffffff"></font><br /><font color="#7f0055"><b>public class </b></font><font color="#000000">PersonDaoHibernate </font><font color="#7f0055"><b>extends </b></font><font color="#000000">BaseDaoHibernate </font><font color="#7f0055"><b>implements </b></font><font color="#000000">PersonDao </font><font color="#000000">{</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#000000">Person getPerson</font><font color="#000000">(</font><font color="#000000">Long id</font><font color="#000000">) {</font><br /><font color="#ffffff">        </font><font color="#000000">Person person = </font><font color="#000000">(</font><font color="#000000">Person</font><font color="#000000">) </font><font color="#000000">getHibernateTemplate</font><font color="#000000">()</font><font color="#000000">.get</font><font color="#000000">(</font><font color="#000000">Person.class, id</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">person == </font><font color="#7f0055"><b>null</b></font><font color="#000000">) {</font><br /><font color="#ffffff">            </font><font color="#7f0055"><b>throw new </b></font><font color="#000000">ObjectRetrievalFailureException</font><font color="#000000">(</font><font color="#000000">Person.class, id</font><font color="#000000">)</font><font color="#000000">;   </font><br /><font color="#ffffff">        </font><font color="#000000">}</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">        </font><font color="#7f0055"><b>return </b></font><font color="#000000">person;</font><br /><font color="#ffffff">    </font><font color="#000000">}</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">savePerson</font><font color="#000000">(</font><font color="#000000">Person person</font><font color="#000000">) {</font><br /><font color="#ffffff">        </font><font color="#000000">getHibernateTemplate</font><font color="#000000">()</font><font color="#000000">.saveOrUpdate</font><font color="#000000">(</font><font color="#000000">person</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#000000">}</font><br /><font color="#ffffff"></font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">removePerson</font><font color="#000000">(</font><font color="#000000">Long id</font><font color="#000000">) {</font><br /><font color="#ffffff">        </font><font color="#3f7f5f">// object must be loaded before it can be deleted</font><br /><font color="#ffffff">        </font><font color="#000000">getHibernateTemplate</font><font color="#000000">()</font><font color="#000000">.delete</font><font color="#000000">(</font><font color="#000000">getPerson</font><font color="#000000">(</font><font color="#000000">id</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#000000">}</font><br /><font color="#000000">}</font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><p>现在，如果你运行<b>ant test-dao -Dtestcase=PersonDao</b>，你会得到同样的错误，我们必须配置Spring来让它知道PersonDaoHibernate是PersonDao的实现，同样的，我们也要告诉它还有个Person对象。 </p><h3 id="section-CreateDAO_zh-3719732622Spring2001330340Person21644PersonDao5">配置Spring中的Person和PersonDao <a class="footnote" name="ref-CreateDAO_zh-5">[#5]</a></h3><p>首先我们要告诉Spring所有Hibernate文件的位置，为此，打开<tt>src/dao/**/dao/hibernate/applicationContext-hibernate.xml</tt>，在以下代码块添加<tt>"Person.hbm.xml"</tt>。 </p><p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#000000">&lt;property name=</font><font color="#2a00ff">"mappingResources"</font><font color="#000000">&gt; </font><br /><font color="#ffffff">    </font><font color="#000000">&lt;list&gt; </font><br /><font color="#ffffff">        </font><font color="#000000">&lt;value&gt;org/appfuse/model/Person.hbm.xml&lt;/value&gt; </font><br /><font color="#ffffff">        </font><font color="#000000">&lt;value&gt;org/appfuse/model/Role.hbm.xml&lt;/value&gt; </font><br /><font color="#ffffff">        </font><font color="#000000">&lt;value&gt;org/appfuse/model/User.hbm.xml&lt;/value&gt;</font><br /><font color="#ffffff">    </font><font color="#000000">&lt;/list&gt; </font><br /><font color="#000000">&lt;/property&gt; </font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><p>现在我们需要添加一些XML数据来绑定PersonDaoHibernate到PersonDao，为此，添加如下代码到文件底部： </p><p><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p><div align="left"><table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0"><tbody><tr><!-- start source code --><td valign="top" nowrap="" align="left"><code><font color="#ffffff"></font><br /><font color="#000000">&lt;!-- PersonDao: Hibernate implementation --&gt; </font><br /><font color="#000000">&lt;bean id=</font><font color="#2a00ff">"personDao" </font><font color="#7f0055"><b>class</b></font><font color="#000000">=</font><font color="#2a00ff">"org.appfuse.dao.hibernate.PersonDaoHibernate"</font><font color="#000000">&gt; </font><br /><font color="#ffffff">    </font><font color="#000000">&lt;property name=</font><font color="#2a00ff">"sessionFactory"</font><font color="#000000">&gt;&lt;ref local=</font><font color="#2a00ff">"sessionFactory"</font><font color="#000000">/&gt;&lt;/property&gt; </font><br /><font color="#000000">&lt;/bean&gt; </font></code></td><!-- end source code --></tr></tbody></table></div><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><p></p><dl><dt></dt><dd><i>你也可以为&lt;bean&gt;使用<b>autowire="byName"</b>属性来消除"sessionFactory"属性</i>。<span style="COLOR: blue"><i>从个人来讲，我喜欢在XML文件里保留对象的依赖。</i></span></dd></dl><h3 id="section-CreateDAO_zh-3681634892DaoTest6">运行DaoTest<a class="footnote" name="ref-CreateDAO_zh-6">[#6]</a></h3>保存所有修改的文件，运行<b>ant test-dao -Dtestcase=PersonDao</b>。 
<p><b>Yeah Baby, Yeah:</b><span style="COLOR: green">BUILD SUCCESSFUL<br />Total time: 9 seconds</span></p><hr /><p><i>下一部分:</i><b>Part II:</b><a class="wikipage" href="http://raibledesigns.com/wiki/Wiki.jsp?page=CreateManager_zh">&amp;#21019;&amp;#24314;&amp;#31649;&amp;#29702;&amp;#22120;Manager</a> - 是一个建立类似于<a class="external" href="http://java.sun.com/blueprints/patterns/SessionFacade.html">Session Facades</a><img class="outlink" alt="" src="mhtml:file://C:\Documents and Settings\Administrator\桌面\DA创建方式O.mht!http://raibledesigns.com/wiki/images/out.png" />的，但不使用EJBs的业务Facade说明，这个facades用来建立从前端到DAO层的联系。 </p><img src ="http://www.blogjava.net/cader/aggbug/57003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cader/" target="_blank">负人博客</a> 2006-07-06 17:53 <a href="http://www.blogjava.net/cader/articles/57003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>