Hibernate Component的用法

转自 http://www.suneca.com
   如果一张表的列太多了,那我们应该怎么做呢?可能有些人的做法就是:将一张一有拆分成两张表,那除了将表进行拆分,我们还能怎么样呢?在 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( "广州IT培训" ) ;
        
         UserDetail detail = new UserDetail( ) ;
         detail. setAddress( "华南师范大学计算机学院" ) ;
         detail. setAge( 20) ;
         detail. setDegree( "工学硕士" ) ;
         detail. setMobilePhone( "13888888888" ) ;
         detail. setPhone( "020-85210088" ) ;
         detail. setPhs( "020-85210088" ) ;
        
         user. setUserDetail( detail) ;
        
         dao. createUser( user) ;         
    }
    
    /**
     * 测试根据ID查找用户
     */

    public void testFind( ) {
         UserDAO dao  = new UserDAOHibernate( ) ;
         User user = dao. findUserById( 1) ;
         System. out. println( user. getUserDetail( ) ) ;
    }
}
原文地址:https://www.cnblogs.com/hlantian/p/10194645.html