原创 对象建模还是E-R建模收藏

新一篇: JSP/Servlet伪静态网页实现 | 旧一篇: 踏进了一道门

       良好的模型对于高效的开发高性能的应用系统是至关重要的。每个团队在进行设计时都必须得进行选择:是用纯OOD/OOA的思想进行对象建模或者用面向关系数据的思想进行E-R建模,这是个艰难的抉择!选择其中的每一种都会导致不同的开发流程,其中各有利弊。

 

下面是使用对象建模的一些工具和方法步骤:

 

流程:类图—>Java源代-à(Xdoclet)-à映射文件(.hbm.xml-à数据库表-à物理数据模型(如果需要的话)

 

1、  先用对象建模工具(例如rose)把类图设计好。在该步骤中要注意把各个类之间的关系(如一对一、一对多、多对多)搞清楚,这使得下一步添加Xdoclet时工作量比较小。

2、  用对象建模工具从设计好的类图中导出Java源代码。

3、  导出源代码后就可在源代码中添加Xdoclet标签了,这些标签用于生成Hibernate的映射文件。在添加Xdoclet标签时要注意的是:要把Xdoclet标签加在每个属性的getter()方法之前,如果只在属性前加标签生成映射文件时就会报错。

举个例子,有一个人的实体类,我们在加Xdoclet时要特别注意,不要只加在属性之前,而是要加在每个属性的getter()方法之前,事实上可以不在属性之前加Xdoclet标签,如下所示例子中有一个Set类型的address属性,元素是Address对象(例子没有给出),假设一个人有多个地址,这是一个一对多的关系,在配置一对多和多对多关系时有几点要注意:

import java.io.Serializable;

import java.util.Set;

import java.util.HashSet;

 

/**

 *         @hibernate.class

 *         table="Tperson"

 *

 */

public class Person implements Serializable {

    private Long personId;

    private String name;

    private int age;

    private Set address = new HashSet(); //在这一定要实例化address对象

    //我们应该在这加Xdoclet

   

    /**

     * 年龄

     *      @hibernate.property

     *      type="int"

     *      column="age"

     */

    public int getAge() {

       return age;

    }

   

    public void setAge(int age) {

       this.age = age;

    }

   

    /**

     * 用户ID

     *      @hibernate.id

     *      generator="native"

     *      type="java.lang.Long"

     *      column="personId"

     */

    public Long getPersonId() {

       return personId;

    }

   

    public void setPersonId(Long personId) {

       this.personId = personId;

    }

   

    /**

     * 用户姓名

     *      @hibernate.property

     *      type="java.lang.String"

     *      column="name"

     *      length="32"

     *      not-null="true"

     */

    public String getName() {

       return name;

    }

   

    public void setName(String name) {

       this.name = name;

    }

   

    /**

     * 用户地址

     *      @hibernate.set

     *      table-"Taddress"

     *      class="Address"

     *

     *      @hibernate.collection-key

     *      column="personId"

     *

     *      注意下面是collection-one-to-many而不是one-to-many

     *      对于多对多关系也是这样collection-many-to-many

     *      @hibernate.collection-one-to-many  

     *      class="Person"

     */

    public Set getAddress() {

       return address;

    }

 

    public void setAddress(Set address) {

       this.address = address;

    }

}

加完了这些Xdoclet我们就可以用工具生成映射文件了。一般用得较多的XdocletHibernate标签有:

              @hibernate.class

              @hibernate.id

              @hibernate.property

              @hibernate.set

              @hibernate.many-to-one

 

以上只给出了一些经常用的标记,大家在开发时可参考Xdoclet手册。

4、  Myeclipse projectproperties窗口,选择左侧的“MyEclipse-XDoclet”“Add Standard...”“Choose an entry”这儿选择“Standard Hibernate”。如下图:右键电击你的工程,然后选择属性,你就会看到这个图。然后选择Myeclipse选项就会看到其中有一个子选项Xdoclet,点击Xdoclet出现如下界面,然后点击Add Standard按钮,选择其中的Standard Hibernate,我们可以看到,Xdoclet支持很多技术的代码生成。

5、  右键点击工程根目录,选择Myeclipse选项的Run Xdoclet,这样就可以生成映射文件了生成的映射文件默认情况下是和你的POJO在同一目录下。(在这我只举了用Myeclipse工具生成映射文件,你也可以用其他方式生成,可选工具:Xdoclet—1.2.3(支持Hibernate3)Ant构建,具体配置请查阅相关资料)

 

6、这一步要从映射文件生成数据库表。下面写一个测试类来生成数据库表,同时也一定程度上验证了我们的映射文件的配置文件是否正确,如果不正确,那么在生成数据库表时就会发生错误。

import java.io.File;

import java.util.List;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.HibernateException;

import org.hibernate.cfg.Configuration;

import junit.framework.TestCase;

public class TestHibernate extends TestCase {

    protected Session session;

    public TestHibernate(String s) {

       super(s);

    }

    protected void setUp() throws Exception {

       super.setUp();

       try {

           Configuration config = new Configuration().configure(new File("C:\\hibernate.cfg.xml"));

           SessionFactory factory = config.buildSessionFactory();

           session = factory.openSession();

       } catch(HibernateException e) {

           e.printStackTrace();

       }

    }

    protected void tearDown() throws Exception {

       super.tearDown();

       try {

           session.close();

       } catch(HibernateException e) {

           e.printStackTrace();

       }

    }

    public void testInsert() {