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表.
*
* <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( ) ) ;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值