一、 开发流程
1、创建DAO和数据映射对象
主要任务:
[1] 创建一个新对象并且加入XDoclet标签
[2] 利用ant从该对象建立一个数据库表
[3] 创建一个DAOTest,运行JUnit来测试DAO
[4] 创建一个DAO,实现对该对象的CRUD(添加、删除、更新)操作
[5] 在Spring中配置Person object 和 PersonDAO
[6] 运行DAOTest
首先我们需要创建一个Person对象。
package org.appfuse.model;
public class Person extends BaseObject { private Long id; private String firstName; private String lastName;
/* Generate your getters and setters using your favorite IDE: In Eclipse: Right-click -> Source -> Generate Getters and Setters */ }
|
这个类扩展基类BaseObject。基类具备equals(), hashCode() ,toString() 三个方法,hibernate组件需要使用这些方法。
创建以后,我们需要添加XDoclet标签来生成Hibernate Map File。Hibernate map object – tables -- columns
增加@hibernate.class 到代码
/** * @hibernate.class table="person" */ public class Person extends BaseObject {
|
增加XDoclet标签来生成主键
/** * @return Returns the id. * @hibernate.id column="id" * generator-class="increment" unsaved-value="null" */
public Long getId() { return this.id; }
|
利用ant从object建立数据库表
利用命令 ant setup-db来建立数据库表。这个命令可以建立Person.hbm.xml文件和数据库表Person。
[schemaexport] create table person (
[schemaexport] id bigint not null,
[schemaexport] primary key (id)
[schemaexport] );
Person.hbm.xml文件在build/dao/gen/**/hibernate 目录下可以找到。你可以在那里发现该文件内容为:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping> <class name="org.appfuse.model.Person" table="person" dynamic-update="false" dynamic-insert="false" >
<id name="id" column="id" type="java.lang.Long" unsaved-value="null" > <generator class="increment"> </generator> </id>
<!-- To add non XDoclet property mappings, create a file named hibernate-properties-Person.xml containing the additional properties and place it in your merge dir. -->
</class>
</hibernate-mapping>
|
现在我们加入@hibernate.property属性,来生成数据表的列。
/** * @hibernate.property column="first_name" length="50" */ public String getFirstName() { return this.firstName; }
/** * @hibernate.property column="last_name" length="50" */ public String getLastName() { return this.lastName; }
|
运行 ant setup-db 命令来生成数据库
[schemaexport] create table person (
[schemaexport] id bigint not null,
[schemaexport] first_name varchar(50),
[schemaexport] last_name varchar(50),
[schemaexport] primary key (id)
[schemaexport] );
你可以通过修改property 的其他属性来订制列。
由于采用测试驱动开发方法,所有下面首先建立 DAOTest。该测试类建立在test/dao/**/dao目录下。我们采用Spring框架来组装DAO。
package org.appfuse.dao;
import org.appfuse.model.Person; import org.springframework.dao.DataAccessException;
public class PersonDAOTest extends BaseDAOTestCase { private Person person = null; private PersonDAO dao = null;
protected void setUp() throws Exception { super.setUp(); dao = (PersonDAO) ctx.getBean("personDAO"); }
protected void tearDown() throws Exception { super.tearDown(); dao = null; } }
|
该测试类扩展了BaseDAOTestCase类,具备了初始化方法。并且从Spring的ApplicationContext中得到类实例。
下面给这个测试类添加CRUD(create, retrieve, update, delete)方法。代码如下:
public void testGetPerson() throws Exception { person = new Person(); person.setFirstName("Matt"); person.setLastName("Raible");
dao.savePerson(person); assertNotNull(person.getId());
person = dao.getPerson(person.getId()); assertEquals(person.getFirstName(), "Matt"); }
public void testSavePerson() throws Exception { person = dao.getPerson(new Long(1)); person.setFirstName("Matt");
person.setLastName("Last Name Updated");
dao.savePerson(person);
if (log.isDebugEnabled()) { log.debug("updated Person: " + person); }
assertEquals(person.getLastName(), "Last Name Updated"); }
public void testAddAndRemovePerson() throws Exception { person = new Person(); person.setFirstName("Bill"); person.setLastName("Joy");
dao.savePerson(person);
assertEquals(person.getFirstName(), "Bill"); assertNotNull(person.getId());
if (log.isDebugEnabled()) { log.debug("removing person..."); }
dao.removePerson(person.getId());
try { person = dao.getPerson(person.getId()); fail("Person found in database"); } catch (DataAccessException dae) { log.debug("Expected exception: " + dae.getMessage()); assertNotNull(dae); } }
|
在测试时,有时会需要一些初始数据,这些初始数据可以在metadata/sql/sample-data.xml文件中定义。代码如下:
<table name='person'>
<column>id</column>
<column>first_name</column>
<column>last_name</column>
<row>
<value>1</value>
<value>Matt</value>
<value>Raible</value>
</row>
</table>
建立DAO接口
package org.appfuse.dao;
import org.appfuse.model.Person;
public interface PersonDAO extends DAO { public Person getPerson(Long personId); public void savePerson(Person person); public void removePerson(Long personId); }
|
建立Hibernate的DAO实现类
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 compile-dao来编译DAO类,使用ant test-dao –Dtestcase=PersonDAO来进行DAO的测试。DAO接口建立在src/dao目录下,DAOHibernate实现类建立在src/dao/hibernate目录下。
在Spring框架中配置Person类和PersonDAO。
在src/dao/**/dao/hibernate/applicationContext-hibernate.xml文件中进行如下配置:
<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> <value>org/appfuse/model/UserCookie.hbm.xml</value> </list> </property>
|
然后加入下列代码邦定Person.hbm.xml到PersonDAO对象。
<!-- PersonDAO: Hibernate implementation --> <bean id="personDAO" class="org.appfuse.dao.hibernate.PersonDAOHibernate"> <property name="sessionFactory"><ref local="sessionFactory"/></property> </bean>
|
如果为了简单你可以直接使用autowrie=”ByName”来直接生成xml文件中的内容。
现在运行测试可以得到正确的结果,那么你的DAO和Person对象创建成功!