hibernate 映射组成关系( component )

 

  • 普通映射

如果一张表的列太多了,那我们应该怎么做呢?可能有些人的做法就是:将一张一有拆分成两张表,那除了将表进行拆分,我们还能怎么样呢?在 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表.
*
*
* 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 ( ) ) ;
     }
}

  • 复合组成关系
computer ----------> CP UBox -------------->GraphicsCard
                                              -------------->Vendor

CP UBox,GraphicsCard是组成关系,没有hbm.xml
Verndor 是关联关系 有 Vendor.hbm.xml 对应

Computer.hbm.xml

<hibernate-mapping>
   <class name="mypack.Computer" table="COMPUTERS">
          <id name="id" type="long" colum="ID">
              <generatro  class="increment"/>
          </id>
          <property name="type" type="string">
                <column name="COMPUTER_TYPE" />
          </property>
          
          <component name="cpuBox" class="mypack.CpuBox">
                  <parent name="computer"/>
                  <property name="type" type="string">
                       <column name="CPUBOX_TYPE" />
                  </property>
                   <component name="graphicsCard" class="mypack.GraphicsCard">
                        <parent name="cpuBox"/>
                        <property name="type" type="string">
                              <column name="GRAPHICSCARD_TYPE" />
                         </property>                   
                   </component>
                    
                   <many-to-one name="vendor" column="CPUBOX_VENDOR_ID" class="mypack.Vendor" not-null="true"
          </component>
  </class>
</hibernate-mapping>
 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值