hibernate中处理枚举类型

先看一张表:

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的技术。(请关注下会分解)。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/76ersjy2/archive/2009/01/10/3747356.aspx

你可能感兴趣的:(sql,.net,Hibernate,log4j,xml)