| At line 1 changed 1 line. | 
| __Part I:__ [在AppFuse建立DAO和对象|CreateDAO_zh] - 一个建立对象(代表数据库的表)和把这些对象存储到数据库的Java类的教程。 | 
| __Part I:__ [在AppFuse建立DAO和POJO |CreateDAO_zh] - 一个建立对象(代表数据库的表)和把这些对象存储到数据库的Java类的教程。 | 
| At line 43 changed 1 line. | 
| %%note __注意:__ 直接拷贝本教程的代码 [在FireFox下无效|http://raibledesigns.com/page/rd?anchor=java2html_plugin_for_jspwiki_causes],但我们可以通过CTRL+Click选定一个代码所在的工作区(OS X下是Command+Click),然后再拷贝。%% | 
| %%note __注意:__ [不能在FireFox中|http://raibledesigns.com/page/rd?anchor=java2html_plugin_for_jspwiki_causes]直接拷贝本教程的代码 ,但我们可以通过CTRL+Click选定一个代码所在的工作区(OS X下是Command+Click),然后再拷贝。%% | 
| At line 62 changed 1 line. | 
| 这个类必须扩展[BaseObject|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/model/BaseObject.java.html],而这个BaseObject有三个抽象方法(equals(), hashCode()和toString())需要你在Person类里实现,前两个是Hibernate的需要。为了完成这部分工作最简单的方式是使用[Commonclipse|http://commonclipse.sf.net],关于这个工具更多的信息可以在[Lee Grey的网站|http://www.leegrey.com/hmm/2004/09/29/1096491256000.html]里看到,另外一个你可以使用的Eclipse的插件是[Commons4E|http://commons4e.berlios.de/],我还没有使用过,这里不便对其功能作出评论。 | 
| 这个类必须扩展[BaseObject|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/model/BaseObject.java.html],而这个BaseObject有三个抽象方法(equals(), hashCode()和toString())需要你在Person类里实现,前两个是Hibernate的需要。为了完成这部分工作最简单的方式是使用[Commonclipse|http://commonclipse.sf.net],关于这个工具更多的信息可以在[Lee Grey的站点|http://www.leegrey.com/hmm/2004/09/29/1096491256000.html]里看到,另外一个你可以使用的Eclipse的插件是[Commons4E|http://commons4e.berlios.de/],我还没有使用过,这里不便对其功能作出评论。 | 
| At line 93 changed 1 line. | 
| ;:%%(color: blue)''我使用{{generator-class="increment"}}而不使用{{generate-class="native"}} 是因为我对数据库使用"native"时[发现了一些问题|AppFuseOnDB2],如果你只是希望使用MySQL,__推荐使用"native"值__,本教程使用increment。''%% | 
| ;:%%(color: blue)''我使用{{generator-class="increment"}}而不使用{{generate-class="native"}} 是因为我对数据库使用"native"时[发现一些问题|AppFuseOnDB2],如果你只是希望使用MySQL,__推荐使用"native"值__,本教程使用increment。''%% | 
| At line 181 changed 1 line. | 
| 现在,我们要创建一个DaoTest来测试我们的DAO的工作,等会儿,你说,我们还不曾创建DAO呢!,你说得对。无论如何,我发现[测试驱动开发|http://www.artima.com/intv/testdriven.html]大大的促进了软件质量,在许多年里我一直认为__在写代码之前写测试__是胡说八道,这看起来很愚蠢,但当我尝试之后我认为这样非常好,现在我按照测试驱动的方式工作完全因为我发现这样可以大大提高我软件开发的效率。 | 
| 现在,我们要创建一个DaoTest来测试我们的DAO的工作,等会儿,你说,我们还不曾创建DAO呢!,你说得对。无论如何,我发现[测试驱动开发|http://www.artima.com/intv/testdriven.html]大大的促进了软件质量,在许多年里我一直认为__在写代码之前写测试__是胡说八道,这看起来很愚蠢,但当我尝试之后我认为这样非常好,现在我按照测试驱动的方式工作完全因为我发现这样可以大大提高我软件开发的效率。 | 
| At line 199 changed 3 lines. | 
| protected void setUp() throws Exception { | 
| super.setUp(); | 
| dao = (PersonDao) ctx.getBean("personDao"); | 
| public void setPersonDao(PersonDao dao) { | 
| this.dao = dao; | 
| At line 203 removed 5 lines. | 
|  | 
| protected void tearDown() throws Exception { | 
| super.tearDown(); | 
| dao = null; | 
| } | 
| At line 304 changed 1 line. | 
| 在目前情况下,还不可以编译PersonDaoTest,因为在类路径里还没有PersonDao.class,我们需要创建它。PersonDAO.java是一个接口,PersonDAOHibernate.java是它的Hibernate实现,让我们继续,开始创建。 | 
| 在目前情况下,还不可以编译PersonDaoTest,因为在类路径里还没有PersonDao.class,我们需要创建它。PersonDao.java是一个接口,PersonDaoHibernate.java是它的Hibernate实现,让我们继续,开始创建。 | 
| At line 317 added 75 lines. | 
|  | 
| ;:''运行dao测试的ant任务叫做__test-dao__,如果你传递testcase参数(用__-Dtestcase=name__),它会查看{{**/*${testcase}*}}允许我们传递Person、PersonDao、或者PersonDaoTest以及所有会执行PersonDaoTest的类。'' | 
|  | 
| 让我们创建一个实现PersonDao的类PersonDaoHibernate并使用Hibernate来get/save/delete这个Person对象,为此,我们在{{src/dao/**/dao/hibernate}}创建一个新类{{PersonDaoHibernate.java}},它应该扩展[BaseDaoHibernate|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDAOHibernate.java.html],并且实现PersonDao。''为了简洁,省略Javadocs。'' | 
|  | 
| [{Java2HtmlPlugin | 
|  | 
| package org.appfuse.dao.hibernate; | 
|  | 
| import org.appfuse.model.Person; | 
| import org.appfuse.dao.PersonDao; | 
| import org.springframework.orm.ObjectRetrievalFailureException; | 
|  | 
| public class PersonDaoHibernate extends BaseDaoHibernate implements PersonDao { | 
|  | 
| public Person getPerson(Long id) { | 
| Person person = (Person) getHibernateTemplate().get(Person.class, id); | 
|  | 
| if (person == null) { | 
| throw new ObjectRetrievalFailureException(Person.class, id); | 
| } | 
|  | 
| return person; | 
| } | 
|  | 
| public void savePerson(Person person) { | 
| getHibernateTemplate().saveOrUpdate(person); | 
| } | 
|  | 
| public void removePerson(Long id) { | 
| // object must be loaded before it can be deleted | 
| getHibernateTemplate().delete(getPerson(id)); | 
| } | 
| } | 
| }] | 
|  | 
| 现在,如果你运行__ant test-dao -Dtestcase=PersonDao__,你会得到同样的错误,我们必须配置Spring来让它知道PersonDaoHibernate是PersonDao的实现,同样的,我们也要告诉它还有个Person对象。 | 
|  | 
| !!配置Spring中的Person和PersonDao [#5] | 
|  | 
| 首先我们要告诉Spring所有Hibernate文件的位置,为此,打开{{src/dao/**/dao/hibernate/applicationContext-hibernate.xml}},在以下代码块添加{{"Person.hbm.xml"}}。 | 
|  | 
| [{Java2HtmlPlugin | 
|  | 
| <property name="mappingResources"> | 
| <list> | 
| <value>org/appfuse/model/Person.hbm.xml</value> | 
| <value>org/appfuse/model/Role.hbm.xml</value> | 
| <value>org/appfuse/model/User.hbm.xml</value> | 
| </list> | 
| </property> | 
| }] | 
|  | 
| 现在我们需要添加一些XML数据来绑定PersonDaoHibernate到PersonDao,为此,添加如下代码到文件底部: | 
|  | 
| [{Java2HtmlPlugin | 
|  | 
| <!-- PersonDao: Hibernate implementation --> | 
| <bean id="personDao" class="org.appfuse.dao.hibernate.PersonDaoHibernate"> | 
| <property name="sessionFactory"><ref local="sessionFactory"/></property> | 
| </bean> | 
| }] | 
|  | 
| ;:''你也可以为<bean>使用__autowire="byName"__属性来消除"sessionFactory"属性''。%%(color: blue)''从个人来讲,我喜欢在XML文件里保留对象的依赖。''%% | 
|  | 
| !!运行DaoTest[#6] | 
| 保存所有修改的文件,运行__ant test-dao -Dtestcase=PersonDao__。 | 
|  | 
| __Yeah Baby, Yeah:__ | 
| %%(color:green)BUILD SUCCESSFUL\\ | 
| Total time: 9 seconds%% | 
|  | 
| ---- | 
|  | 
| ''下一部分:'' __Part II:__ [创建新的Manager|CreateManager_zh] - 是一个建立类似于[Session Facades|http://java.sun.com/blueprints/patterns/SessionFacade.html]的,但不使用EJBs的业务Facade说明,这个facades用来建立从前端到DAO层的联系。 |