转自
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)
) ;
/*==============================================================*/
/* 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;
}
}
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;
}
}
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>
< !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( ) ) ;
}
}
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( ) ) ;
}
}