Dashboard > OpenSource Project > ... > Hibernate 3入門 > Component
OpenSource Project Log In   View a printable version of the current page.
Component
Added by zach14c, last edited by zach14c on Aug 23, 2005
Labels: 
(None)

假設您設計了這麼一個user表格:

CREATE TABLE user (
    id INT(11) NOT NULL auto_increment PRIMARY KEY,
    name VARCHAR(100) NOT NULL default '',
    age INT,
    email VARCHAR(100) NOT NULL
);

最基本的映射策略中,您可以設計一個如下的User類別與之對應:

package onlyfun.caterpillar; 

public class User { 
    private Integer id; 
    private String name; 
    private int age; 
    private String email; 

    ........ 
}

現在假設您基於業務上的設計需求,您需要將email資訊提昇為一個MailAddress物件,讓它攜帶更多資訊或負有特定職責,例如:

MailAddress.java
package onlyfun.caterpillar;

public class MailAddress {
    private String email;

    public MailAddress() {       
    }
    
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    
    public void sendMail() {
        System.out.println("Send mail to " + email);
    }
}

而User類別中有(has a)MailAddress,例如:

User.java
package onlyfun.caterpillar;

public class User {
    private Integer id;
    private String name;
    private Integer age;
    private MailAddress mailAddress;
    
    // 必須要有一個預設的建構方法
    // 以使得Hibernate可以使用Constructor.newInstance()建立物件
    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public MailAddress getMailAddress() {
        return mailAddress;
    }

    public void setMailAddress(MailAddress mailAddress) {
        this.mailAddress = mailAddress;
    }
}

在資料庫表格方面並沒有任何的改變,這是基於程式設計上的考量,增加物件設計上的粒度,MailAddress為User的一個Component,在映射文件上,您可以使用<component>標籤來完成這樣的映射:

User.hbm.xml
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping 
    PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 
    <class name="onlyfun.caterpillar.User" table="user"> 
        <id name="id" column="id" type="java.lang.Integer"> 
            <generator class="native"/> 
        </id>
        <property name="name" column="name" type="java.lang.String"/>
        <property name="age" column="age" type="java.lang.Integer"/>
        <component name="mailAddress" class="onlyfun.caterpillar.MailAddress"> 
            <property name="email" 
                      column="email" 
                      type="java.lang.String" 
                      not-null="true"/> 
        </component> 
    </class> 
</hibernate-mapping>

在物件儲存時的一個示範如下:

MailAddress mailAddress = new MailAddress();
mailAddress.setEmail("caterpillar.onlyfun@gmail.com");
        
User user = new User();
user.setName("caterpillar");
user.setAge(new Integer(30));
user.setMailAddress(mailAddress);

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();            
session.save(user); 
session.flush();
tx.commit();
session.close();

在物件查詢與使用上的一個例子如下:

Session session = sessionFactory.openSession();

User user = (User) session.load(User.class, new Integer(1));
System.out.println(user.getAge() + "\t" +
                                  user.getName() + "\t" +
                                  user.getMailAddress().getEmail());
user.getMailAddress().sendMail();
 
session.close();

Site powered by a free Open Source Project / Non-profit License (more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.1.5a Build:#411 Mar 16, 2006) - Bug/feature request - Contact Administrators