Hibernate如何映射enum

注:内容来自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)

)

 

hibernatepojo中可以这样描述:

 

  

  1. public final class TestVO {
  2.     private Integer id;
  3. public static enum Gender {
  4.         MALE, FEMALE;
  5.     }
  6.     private Gender gender;
  7.     public Integer getId() {
  8.         return id;
  9.     }
  10.     public void setId(Integer id) {
  11.         this.id = id;
  12.     }   
  13.     
  14.     public Gender getGender() {
  15.         return gender;
  16.     }
  17.     public void setGender(Gender gender) {
  18.         this.gender = gender;
  19.     }
  20. }

而后要自己写一个适合enum的在hibernate中的类型,虽然hibernate已经有了

Org.hibernate.type.EnumType.但是这个类是用于annotation的(在后面会讨论怎么用annotation技术映射enum.

 

 

创建一个自己的EnumUserType:

  1. import java.io.Serializable;
  2. import java.sql.PreparedStatement;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Types;
  6. import org.hibernate.HibernateException;
  7. import org.hibernate.usertype.UserType;
  8. import org.apache.log4j.*;
  9. public class EnumUserType<E extends Enum<E>> implements UserType {
  10.     private Logger log = Logger.getLogger(EnumUserType.class);
  11.     private Class<E> clazz = null;
  12.     private static final int[] SQL_TYPES = { Types.VARCHAR };
  13.     protected EnumUserType(Class<E> c) {
  14.         this.clazz = c;
  15.     }
  16.     public int[] sqlTypes() {
  17.         return SQL_TYPES;
  18.     }
  19.     public Class<E> returnedClass() {
  20.         return clazz;
  21.     }
  22.     public Object assemble(Serializable cached, Object owner)
  23.             throws HibernateException {
  24.         // TODO Auto-generated method stub
  25.         return cached;
  26.     }
  27.     public Object deepCopy(Object value) throws HibernateException {
  28.         // TODO Auto-generated method stub
  29.         return value;
  30.     }
  31.     public Serializable disassemble(Object value) throws HibernateException {
  32.         // TODO Auto-generated method stub
  33.         return (Serializable) value;
  34.     }
  35.     public boolean equals(Object x, Object y) throws HibernateException {
  36.         // TODO Auto-generated method stub
  37.         if (x == y)
  38.             return true;
  39.         if (null == x || null == y)
  40.             return true;
  41.         return x.equals(y);
  42.     }
  43.     public int hashCode(Object x) throws HibernateException {
  44.         // TODO Auto-generated method stub
  45.         return x.hashCode();
  46.     }
  47.     public boolean isMutable() {
  48.         // TODO Auto-generated method stub
  49.         return false;
  50.     }
  51.     public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
  52.             throws HibernateException, SQLException {
  53.         // TODO Auto-generated method stub
  54.         E result = null;
  55.         if (!resultSet.wasNull()) {
  56.             String name = resultSet.getString(names[0]).toUpperCase();
  57.             result = Enum.valueOf(clazz, name);
  58.         }
  59.         return result;
  60.     }
  61.     public void nullSafeSet(PreparedStatement prepareStatement, Object value,
  62.             int index) throws HibernateException, SQLException {
  63.         // TODO Auto-generated method stub
  64.         if (null == value) {
  65.             prepareStatement.setNull(index, Types.VARCHAR);
  66.         } else {
  67.             prepareStatement.setString(index, ((Enum) value).name());
  68.         }
  69.     }
  70.     public Object replace(Object original, Object target, Object owner)
  71.             throws HibernateException {
  72.         // TODO Auto-generated method stub
  73.         return original;
  74.     }
  75. }

 

在这里笔者严重提醒大家:

如果你的枚举类里定义的是大写字母,比如:

public static enum Gender {

        MALE, FEMALE;

    }

那么在String name = resultSet.getString(names[0]).toUpperCase();

这里一定要加上toUpperCase()方法。笔者这里介绍的方法,只适用于enmu里的类型为String类型,若要映射其他类新,可以自己修改。

 

最后创建一个子类,继承于这个类:

 

  1. public class GenderEnumType extends EnumUserType<Gender> {
  2.     public GenderEnumType() {
  3.         super(Gender.class);
  4.         // TODO Auto-generated constructor stub
  5.     }
  6. }

 

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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值