注:内容来自http://blog.csdn.net/76ersjy2/archive/2009/01/10/3747356.aspx
先看一张表:
Create table test(
Test_id integer not null auto_increment,
gender Enum(MALE, FEMALE)
)
在hibernate的pojo中可以这样描述:
- public final class TestVO {
- private Integer id;
- public static enum Gender {
- MALE, FEMALE;
- }
- private Gender gender;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public Gender getGender() {
- return gender;
- }
- public void setGender(Gender gender) {
- this.gender = gender;
- }
- }
而后要自己写一个适合enum的在hibernate中的类型,虽然hibernate已经有了
Org.hibernate.type.EnumType.但是这个类是用于annotation的(在后面会讨论怎么用annotation技术映射enum).
创建一个自己的EnumUserType:
- import java.io.Serializable;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Types;
- import org.hibernate.HibernateException;
- import org.hibernate.usertype.UserType;
- import org.apache.log4j.*;
- public class EnumUserType<E extends Enum<E>> implements UserType {
- private Logger log = Logger.getLogger(EnumUserType.class);
- private Class<E> clazz = null;
- private static final int[] SQL_TYPES = { Types.VARCHAR };
- protected EnumUserType(Class<E> c) {
- this.clazz = c;
- }
- public int[] sqlTypes() {
- return SQL_TYPES;
- }
- public Class<E> returnedClass() {
- return clazz;
- }
- public Object assemble(Serializable cached, Object owner)
- throws HibernateException {
- // TODO Auto-generated method stub
- return cached;
- }
- public Object deepCopy(Object value) throws HibernateException {
- // TODO Auto-generated method stub
- return value;
- }
- public Serializable disassemble(Object value) throws HibernateException {
- // TODO Auto-generated method stub
- return (Serializable) value;
- }
- public boolean equals(Object x, Object y) throws HibernateException {
- // TODO Auto-generated method stub
- if (x == y)
- return true;
- if (null == x || null == y)
- return true;
- return x.equals(y);
- }
- public int hashCode(Object x) throws HibernateException {
- // TODO Auto-generated method stub
- return x.hashCode();
- }
- public boolean isMutable() {
- // TODO Auto-generated method stub
- return false;
- }
- public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
- throws HibernateException, SQLException {
- // TODO Auto-generated method stub
- E result = null;
- if (!resultSet.wasNull()) {
- String name = resultSet.getString(names[0]).toUpperCase();
- result = Enum.valueOf(clazz, name);
- }
- return result;
- }
- public void nullSafeSet(PreparedStatement prepareStatement, Object value,
- int index) throws HibernateException, SQLException {
- // TODO Auto-generated method stub
- if (null == value) {
- prepareStatement.setNull(index, Types.VARCHAR);
- } else {
- prepareStatement.setString(index, ((Enum) value).name());
- }
- }
- public Object replace(Object original, Object target, Object owner)
- throws HibernateException {
- // TODO Auto-generated method stub
- return original;
- }
- }
在这里笔者严重提醒大家:
如果你的枚举类里定义的是大写字母,比如:
public static enum Gender {
MALE, FEMALE;
}
那么在String name = resultSet.getString(names[0]).toUpperCase();
这里一定要加上toUpperCase()方法。笔者这里介绍的方法,只适用于enmu里的类型为String类型,若要映射其他类新,可以自己修改。
最后创建一个子类,继承于这个类:
- public class GenderEnumType extends EnumUserType<Gender> {
- public GenderEnumType() {
- super(Gender.class);
- // TODO Auto-generated constructor stub
- }
- }
这样,GenderEnumType就是你在hibernate中定义的可以映射enum的类。
当然要写入**.hbm.xml了:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package=" ">
<class name="TestVO" table="test">
<id name="id" column="test_id">
<generator class="native" />
</id>
<property name="gender" not-null="true" column="gender"
type="GenderEnumType" />
</class>
</hibernate-mapping>
(注释:包的命名可以自己去改,这里不在解释)。
也许你认为这种方法,是在是太麻烦了,当然了,肯定有好的解决方法:JDK5.0中的annotation的技术。(请关注下会分解)。