hhboyggyy 2010-04-26
先看一张表:
Createtabletest(
Test_idintegernotnullauto_increment,
genderEnum(MALE,FEMALE)
)
在hibernate的pojo中可以这样描述:
publicfinalclassTestVO{
privateIntegerid;
publicstaticenumGender{
MALE,FEMALE;
}
privateGendergender;
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
publicGendergetGender(){
returngender;
}
publicvoidsetGender(Gendergender){
this.gender=gender;
}
}
而后要自己写一个适合enum的在hibernate中的类型,虽然hibernate已经有了
Org.hibernate.type.EnumType.但是这个类是用于annotation的(在后面会讨论怎么用annotation技术映射enum).
创建一个自己的EnumUserType:
importjava.io.Serializable;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Types;
importorg.hibernate.HibernateException;
importorg.hibernate.usertype.UserType;
importorg.apache.log4j.*;
publicclassEnumUserType<EextendsEnum<E>>implementsUserType{
privateLoggerlog=Logger.getLogger(EnumUserType.class);
privateClass<E>clazz=null;
privatestaticfinalint[]SQL_TYPES={Types.VARCHAR};
protectedEnumUserType(Class<E>c){
this.clazz=c;
}
publicint[]sqlTypes(){
returnSQL_TYPES;
}
publicClass<E>returnedClass(){
returnclazz;
}
publicObjectassemble(Serializablecached,Objectowner)
throwsHibernateException{
//TODOAuto-generatedmethodstub
returncached;
}
publicObjectdeepCopy(Objectvalue)throwsHibernateException{
//TODOAuto-generatedmethodstub
returnvalue;
}
publicSerializabledisassemble(Objectvalue)throwsHibernateException{
//TODOAuto-generatedmethodstub
return(Serializable)value;
}
publicbooleanequals(Objectx,Objecty)throwsHibernateException{
//TODOAuto-generatedmethodstub
if(x==y)
returntrue;
if(null==x||null==y)
returntrue;
returnx.equals(y);
}
publicinthashCode(Objectx)throwsHibernateException{
//TODOAuto-generatedmethodstub
returnx.hashCode();
}
publicbooleanisMutable(){
//TODOAuto-generatedmethodstub
returnfalse;
}
publicObjectnullSafeGet(ResultSetresultSet,String[]names,Objectowner)
throwsHibernateException,SQLException{
//TODOAuto-generatedmethodstub
Eresult=null;
if(!resultSet.wasNull()){
Stringname=resultSet.getString(names[0]).toUpperCase();
result=Enum.valueOf(clazz,name);
}
returnresult;
}
publicvoidnullSafeSet(PreparedStatementprepareStatement,Objectvalue,
intindex)throwsHibernateException,SQLException{
//TODOAuto-generatedmethodstub
if(null==value){
prepareStatement.setNull(index,Types.VARCHAR);
}else{
prepareStatement.setString(index,((Enum)value).name());
}
}
publicObjectreplace(Objectoriginal,Objecttarget,Objectowner)
throwsHibernateException{
//TODOAuto-generatedmethodstub
returnoriginal;
}
}
在这里笔者严重提醒大家:
如果你的枚举类里定义的是大写字母,比如:
publicstaticenumGender{
MALE,FEMALE;
}
那么在Stringname=resultSet.getString(names[0]).toUpperCase();
这里一定要加上toUpperCase()方法。笔者这里介绍的方法,只适用于enmu里的类型为String类型,若要映射其他类新,可以自己修改。
最后创建一个子类,继承于这个类:
publicclassGenderEnumTypeextendsEnumUserType<Gender>{
publicGenderEnumType(){
super(Gender.class);
//TODOAuto-generatedconstructorstub
}
}
这样,GenderEnumType就是你在hibernate中定义的可以映射enum的类。
当然要写入**.hbm.xml了:
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="">
<classname="TestVO"table="test">
<idname="id"column="test_id">
<generatorclass="native"/>
</id>
<propertyname="gender"not-null="true"column="gender"
type="GenderEnumType"/>
</class>
</hibernate-mapping>
(注释:包的命名可以自己去改,这里不在解释)。
也许你认为这种方法,是在是太麻烦了,当然了,肯定有好的解决方法:JDK5.0中的annotation的技术。(请关注下会分解)。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/76ersjy2/archive/2009/01/10/3747356.aspx