hibernate中处理枚举类型

先看一张表:

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

相关推荐