下面这个类,真不好理解?
为什么要继承这么多的方法?
有什么用呢?

/**
 * 在数据库表中使用一个varchar类型的列保存枚举常量的name值。<br>
 * 在配置时,需要指定一个属性:enumClassName 。用于指定所对应的枚举类型的全限定名。<br>
 * 如果是内部类,就用$。如:cn.itcast.bbs.domain.User$Sex(假设Sex是在User中定义的静态内部类)。
 * 
 * <pre>
 * 示例:
 * &lt;typedef name=&quot;genderType&quot; class=&quot;cn.itcast.bbs.domain.hibernate.HibernateGenericEnumType&quot;&gt;
 *  &lt;param name=&quot;enumClassName&quot;&gt;cn.itcast.bbs.domain.Gender&lt;/param&gt;
 * &lt;/typedef&gt;
 * </pre>
 * @author tyg
 * 
 */
@SuppressWarnings("unchecked")
public class HibernateGenericEnumType2 implements UserType, ParameterizedType { public HibernateGenericEnumType2(){
System.out.println("HibernateGenericEnumType2()&&&&&&&&&&&&&");
}


protected Class<? extends Enum> enumClass;
protected int sqlType = Types.VARCHAR; protected Class<? extends Enum> getEnumClass() {
System.out.println("HibernateGenericEnumType2()&&&&&&&getEnumClass():"+this.enumClass);
return this.enumClass;
} public void setParameterValues(Properties parameters) {
String enumClassName = parameters.getProperty("enumClassName");
System.out.println("HibernateGenericEnumType2()&&&&&&setParameterValues:"+enumClassName);
try {
this.enumClass = (Class<Enum>) Class.forName(enumClassName);
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("指定了一个不正确的枚举类型【" + enumClassName + "】", e);
}
} /** 用于设定nullSafeGet所返回的数据的类型。即我们的自定义的数据类型。 */
public Class<? extends Enum> returnedClass() {
System.out.println("HibernateGenericEnumType2()&&&&&&returnedClass():"+getEnumClass());
return getEnumClass();
} /** 对应的数据库表中列的类型,可选值在java.sql.Types中定义 */
public int[] sqlTypes() {
System.out.println("HibernateGenericEnumType2()&&&&&&sqlTypes():"+new int[] { sqlType });
return new int[] { sqlType };
} /**
 * 在PreparedStatement执行之前会调用本方法。 一般都是在本方法中将自定义类型数据转换成数据库中的数据类型。 要处理值为null时的情况。 其中的value表示的是要写入的值;index表示的是在statement的参数中的索引。
 */
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
System.out.println("HibernateGenericEnumType2()&&&&&&nullSafeSet:");
if (value == null) {
st.setNull(index, sqlType);
} else {
st.setString(index, ((Enum) value).name());
}
} /**
 * 从ResultSet中取出相应的值并转(生)成与属性类型对应的类型, 要处理当值为null时的情况
 */
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
System.out.println("HibernateGenericEnumType2()&&&&&&nullSafeGet(ResultSet:");
String value = rs.getString(names[0]);
if (rs.wasNull()) {
return null;
} return Enum.valueOf(getEnumClass(), value);
} /** 对象是否可变(例如我们这里的Sex不可变) */
public boolean isMutable() {
System.out.println("HibernateGenericEnumType2()&&&&&&isMutable() :");
return false;
} /** 要求返回一个自定义类型的完全复制对象,如果此对象是不可变的(如枚举)或null,可以直接返回value参数 */
public Object deepCopy(Object value) throws HibernateException {
System.out.println("HibernateGenericEnumType2()&&&&&&deepCopy");
return value;
} /**
 * 对对象调用merge方法时对这个属性的拷贝, 如果是不可变对象(如枚举)或null,应直接返回第一个参数值original
 */
public Object replace(Object original, Object target, Object owner) throws HibernateException {
System.out.println("HibernateGenericEnumType2()&&&&&&replace");
return original;
} public boolean equals(Object x, Object y) throws HibernateException {
System.out.println("HibernateGenericEnumType2()&&&&&&equals(");
if (x == null) {
return false;
}
return x.equals(y);
} public int hashCode(Object x) throws HibernateException {
System.out.println("HibernateGenericEnumType2()&&&&&&hashCode(");
return x.hashCode();
} /** 把这个数据放入缓存时要调用的方法 */
public Object assemble(Serializable cached, Object owner) throws HibernateException {
System.out.println("HibernateGenericEnumType2()&&&&&&assemble(");
return cached;
} /** 从缓存中取这个对象数据时要调用的方法 */
public Serializable disassemble(Object value) throws HibernateException {
System.out.println("HibernateGenericEnumType2()&&&&&&disassemble(");
return (Serializable) value;
}}

解决方案 »

  1.   

    实现了UserType, ParameterizedType 两个接口,
    下面的为接口里的方法
      

  2.   

    楼主还没搞明白继承(extends)和实现接口(impelements)的区别咩
    继承只需要重写你需要用到的父类的方法,
    而实现接口则是要实现接口内所有的方法。
      

  3.   

    支持,支持使用UserType首先要弄清楚它的目的。大家知道Hibernate解决的主要是对象数据库阻抗失衡的问题,也就是如何将一个或多个对象保存到一个或多个数据库表格中。这其中有很多方法,其实大部分情况下采用@Embeddable和 @Embedded 就可以解决问题了,只有嵌入对象方式无法满足要求时,或者是Hibernate默认的持久化方式无法满足要求时,才应该考虑UserType。总之记住一 个原则,不到山穷水尽,不要轻易使用UserType。还有一个要慎重考虑使用UserType的原因是:一旦采用了UserType,你的项目就脱离了 JPA,而直接和Hibernate耦合在一起了。
      

  4.   

     Hibernate 对一些常用的基本数据类型(int,char,long等等),与一些常用类(Date,String,Timestamp等)内置了转换器。使得数据库里面这些类型能够顺利地与实体里的属性对应上。但是有的时候,我们需要自定义一个转换器,来转换我们自己的类型。比较常见的就是枚举转换器了,枚举用到的几率比较高,但是HIBERNATE并没有为它内置一个转换器,这个时候就需要我们自己来编写这个转换器了。