hibernate component

Component
本次做MySNS时也用到了Component,在School.java和Address.java以及school.hbm.xml
如果一张表的列太多了,那我们应该怎么做呢?可能有些人的做法就是:将一张一有拆分成两张表,那除了将表进行拆分,我们还能怎么样呢?在 Hibernate对这种表的列太多,进行拆分,有一种非常好的解决方案,那就是基于Component技术,使用Component技术,我们可以将一 种表,按照字段的类型进行分类,同一类的,可以使用一个对象进行封装,而这个封装的对象,就是一个Component。假如,一个用户他的信息可能包含以 下几种分类,住址(包括家庭地址、办公地址、家庭邮编、办公邮编等)、电话(家庭电话、办公电话、手机、小灵通)、邮件地址(办公邮箱、私人邮箱等)、通 信工具(QQ号码、MSN、雅虎帐号、网易泡泡等),对于这些属性类别,我们都可以使用对象进行封装。

    假如现在有以下这样的数据库表:


建表语句:
程序代码
drop table if exists T_USER;

/*==============================================================*/
/* Table: T_USER                                                */
/*==============================================================*/
create table T_USER
(
   ID                   INT not null auto_increment,
   USER_NAME            VARCHAR(20) not null,
   LOGINID              VARCHAR(20) not null,
   PASSWORD             VARCHAR(32) not null,
   AGE                  INT,
   ADDRESS              VARCHAR(255),
   MOBILE_PHONE         VARCHAR(20),
   PHS                  VARCHAR(20),
   PHONE                VARCHAR(20),
   DEGREE               VARCHAR(20),
   primary key (ID)
);


现在假如除了ID、用户名、密码、登录号之外,所有属性都作为Hibernate的一个详细信息,那我们可以这样设计我们的类:
User.java
程序代码
package zizz.model;

import java.io.Serializable;

/**
* 该对象是针对着数据库的T_USER表.
*
* <a href="http://www.suneca.com">ZIZZ</a>
*
* Create-Time:Apr 21, 2008 9:53:58 PM
*/
public class User implements Serializable {

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 1L;

    private int id;
   
    private String userName;
   
    private String loginId;
   
    private String password;
   
    private UserDetail userDetail;

    public UserDetail getUserDetail() {
        return userDetail;
    }

    public void setUserDetail(UserDetail userDetail) {
        this.userDetail = userDetail;
    }

    public int getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getLoginId() {
        return loginId;
    }

    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}


UserDetail.java
程序代码
package zizz.model;

import java.io.Serializable;

/**
* 用户详情信息.
*
* <a href="http://www.suneca.com">ZIZZ</a>
*
* Create-Time:Apr 23, 2008 10:39:47 PM
*/
public class UserDetail implements Serializable{

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 1L;

    private int age;
   
    private String address;
   
    private String mobilePhone;
   
    private String phs;
   
    private String phone;
   
    private String degree;

    public int getAge() {
        return age;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getMobilePhone() {
        return mobilePhone;
    }

    public void setMobilePhone(String mobilePhone) {
        this.mobilePhone = mobilePhone;
    }

    public String getPhs() {
        return phs;
    }

    public void setPhs(String phs) {
        this.phs = phs;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getDegree() {
        return degree;
    }

    public void setDegree(String degree) {
        this.degree = degree;
    }
   
}


User的hibernate mapping file
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 package="zizz.model">
    <class name="User" table="T_USER">
        <id name="id" column="ID">
            <generator class="increment" />
        </id>
        <property name="userName" column="USER_NAME" />
        <property name="loginId" column="LOGINID" />
        <property name="password" column="PASSWORD" />
       
        <component name="userDetail" class="UserDetail" lazy="true">
            <property name="age" column="AGE"/>
            <property name="address" column="ADDRESS"/>
            <property name="mobilePhone" column="MOBILE_PHONE"/>
            <property name="phs" column="PHS"/>
            <property name="phone" column="PHONE"/>
            <property name="degree" column="DEGREE"/>
        </component>
    </class>
</hibernate-mapping>


测试类:
程序代码
package zizz.test;

import zizz.dao.UserDAO;
import zizz.dao.hibernate.UserDAOHibernate;
import zizz.model.User;
import zizz.model.UserDetail;

/**
* 测试Hibernate Component.
* <a href="http://www.suneca.com">ZIZZ</a>
*
* Create-Time:Apr 23, 2008 11:33:30 PM
*/
public class ComponentTest {
   
    public static void main(String[] args){
        ComponentTest test = new ComponentTest();
        test.testFind();
    }
   
    /**
     * 测试创建一个新帐号
     */
    public void testCreateUser(){
        UserDAO dao  = new UserDAOHibernate();
       
        User user = new User();
        user.setLoginId("cyz");
        user.setPassword("admin");
        user.setUserName("");
       
        UserDetail detail = new UserDetail();
        detail.setAddress("");
        detail.setAge(20);
        detail.setDegree("");
        detail.setMobilePhone("");
        detail.setPhone("");
        detail.setPhs("");
       
        user.setUserDetail(detail);
       
        dao.createUser(user);       
    }
   
    /**
     * 测试根据ID查找用户
     */
    public void testFind(){
        UserDAO dao  = new UserDAOHibernate();
        User user = dao.findUserById(1);
        System.out.println(user.getUserDetail());
    }
}

猜你喜欢

转载自fantaoyalin.iteye.com/blog/1508418