Hibernate入门10 - Component 映射

入门 10 - Component 映射

 考虑这么一个对象类别:

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内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值