appfuse1.6使用手册2

Posted on 2004-11-11 08:52  数码民工  阅读(4477)  评论(5编辑  收藏  举报
 

一、       开发流程

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 FileHibernate 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;
    }

利用antobject建立数据库表

利用命令 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类,具备了初始化方法。并且从SpringApplicationContext中得到类实例。

下面给这个测试类添加CRUDcreate, 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);
}

建立HibernateDAO实现类


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.xmlPersonDAO对象。


<!-- PersonDAO: Hibernate implementation --> 
<bean id="personDAO" class="org.appfuse.dao.hibernate.PersonDAOHibernate"
    <property name="sessionFactory"><ref local="sessionFactory"/></property> 
</bean> 

如果为了简单你可以直接使用autowrie=”ByName”来直接生成xml文件中的内容。

 

现在运行测试可以得到正确的结果,那么你的DAOPerson对象创建成功!

Copyright © 2024 数码民工
Powered by .NET 8.0 on Kubernetes