ITEEDU

Hibernate Gossip: Component

假设您设计了这么一个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();