Hibernate入门10 - Component 映射

来源:互联网 发布:mac怎么打开身份不明 编辑:程序博客网 时间:2024/05/16 19:25
 
 考虑这么一个对象类别:
User.java
package onlyfun.caterpillar;
 
public class User {
    private String id;
    private String name;
    private char sex;
    private int age;
    private String address;
 
........
}

 我们建立一个数据库表格与这个类别作对应:
create table USER (
    ID char(32) not null,
    NAME varchar(16) not null,
    SEX char(1),
    AGE integer,
    ADDRESS varchar(255) not null,
    primary key (ID)
);

 这样的对应,您可以依照之前所介绍过的主题来撰写映像文件达成,然而现在我们想要将address属性以一个自订对象Email表示,以便我们将这个自 订对象当作辅助对象,在适当的时候,我们可以直接呼叫Email对象的sendMail()方法,也就是说,我们的User类别变成:
User.java
package onlyfun.caterpillar;
 
public class User {
   private String id;
    private String name;
    private char sex;
    private int age;
    private Email email;
 
    public int getAge() {
        return age;
    }
 
    public String getId() {
        return id;
    }
 
    public String getName() {
        return name;
    }
 
    public char getSex() {
        return sex;
    }
  
    public Email getEmail() {
        return email;
    }
 
    public void setAge(int i) {
        age = i;
    }
 
    public void setId(String string) {
        id = string;
    }
 
    public void setName(String string) {
        name = string;
    }
 
    public void setSex(char c) {
        sex = c;
    }
  
    public void setEmail(Email email) {
        this.email = email;
    }
}

 而我们新增的Email类别设计如下:
Email.java
package onlyfun.caterpillar;
 
public class Email {
    private String address;
  
    public void setAddress(String address) {
        this.address = address;
    }
  
    public String getAddress() {
        return address;
    }
  
    public void sendMail() {
        System.out.println("send mail to: " + address);
    }
}

 实际上,我们只是将使用者的Email信息抽取出来,并独立为一个辅助对象,这是为了在应用程序中操作方便而设计的,而实际上在数据库表格中的信息并没有增加,我们不用改变数据表的内容。
  显然的,如果这么设计,对象与数据表并不是一个对映一个,对象的数量将会比数据表来的多,对象的设计粒度比数据表来的细,为了完成对象与数据表的对应,在 Hibernate中使用<component>标签来进行设定,我们的User.hbm.xml映射文件撰写如下:
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
 
<hibernate-mapping>
 
    <class name="onlyfun.caterpillar.User" table="USER">
 
        <id name="id" type="string" unsaved-value="null">
            <column name="ID" sql-type="char(32)"/>
            <generator class="uuid.hex"/>
        </id>
 
        <property name="name" type="string" not-null="true">
            <column name="NAME" length="16" not-null="true"/>
        </property>
 
        <property name="sex" type="char" column="SEX"/>
 
        <property name="age" type="int" column="AGE"/>
      
        <component name="email" class="onlyfun.caterpillar.Email">
            <property name="address" type="string" column="ADDRESS" not-null="true"/>
        </component>
 
    </class>
 
</hibernate-mapping>

 这个映射文件与之前的映射文件撰写相比,主要是多了红色的<component>部份,将Email类别当作User类别的一个组件(Component)。
 接下来对对象的操作并没有什么太大的差别,例如下面的程序片段示范如何储存数据:
User user = new User();
        user.setName("caterpillar");
        user.setSex('M');
        user.setAge(28);
      
        Email email = new Email();
        email.setAddress("justin@caterpillar.onlyfun.net");
      
        user.setEmail(email);
 
        Session session = sessionFactory.openSession();
        Transaction tx= session.beginTransaction();
 
        session.save(user);
        tx.commit();
  
        session.close();

 下面的程序片段则示范如何查询数据:
Session session = sessionFactory.openSession();
    
        List users = session.find("from User");
 
        session.close();
 
        for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
            User user = (User) iterator.next();
            System.out.println(user.getName() +
                               "/n/tAge: " + user.getAge() +
                               "/n/tSex: " + user.getSex());
            user.getEmail().sendMail();
        }

 关于Component进一步的设定说明,可以看看参考手册的5.1.12内容。
原创粉丝点击