映射枚举枚举类型是一个常见的Java惯用语,其中类有着(小)数量不变的不可变实例。
1、在JDK5.0中使用枚举如果使用JDK5.0,可以给类型安全的枚举使用内建的语言支持。例如,Rating类看起来如下:
package auction.model;
public enum Rating{
EXCELLENT, OK, BAD
}
Comment类有这个类型的一个属性:
public class Comment{
…
private Rating rating;
private Item auction;
…
}
2、编写定制的枚举处理程序现在要介绍的不是最基础的UserType接口,而是EnhanceUserType接口。
public class StringEnumUserType implements EnhancedUserType, ParameterizedType {
private Class enumClass;
public void setParameterValues(Properties parameters) {
String enumClassName = parameters.getProperty("enumClassName");
try {
enumClass = ReflectHelper.classForName(enumClassName);
} catch (ClassNotFoundException e) {
throw new HibernateException("Enum class not found", e);
}
}
// //映射Java值类型
public Class returnedClass() {
return enumClass;
}
// 告诉Hibernate要使用什么SQL列类型生成DDL模式
public int[] sqlTypes() {
return new int[] { StringType.INSTANCE.sqlType() };
}
// 这个类型是否可变
public boolean isMutable() {
return false;
}
// 创建值的快照
public Object deepCopy(Object value) throws HibernateException {
return value;
}
// 以序列化的形保存信息的数据的高速缓存
public Serializable disassemble(Object value) throws HibernateException {
return (Serializable) value;
}
// 高速缓存的数据转变为MonetaryAmount的一个实例
public Object assemble(Serializable cached, Object owner)
throws HibernateException {
return cached;
}
// 处理脱管对象状态的合并
public Object replace(Object original, Object target, Object owner)
throws HibernateException {
return original;
}
public boolean equals(Object x, Object y) throws HibernateException {
if (x == y)
return true;
if (null == x || null == y)
return false;
return x.equals(y);
}
public int hashCode(Object x) throws HibernateException {
return x.hashCode();
}
public Object fromXMLString(String xmlValue) {
return Enum.valueOf(enumClass, xmlValue);
}
public String objectToSQLString(Object value) {
return '\'' + ((Enum) value)。name() + '\'';
}
public String toXMLString(Object value) {
return ((Enum) value)。name();
}
public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
throws HibernateException, SQLException {
String name = rs.getString(names[0]);
return rs.wasNull() ? null : Enum.valueOf(enumClass, name);
}
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws HibernateException, SQLException {
if (null == value) {
st.setNull(index, StringType.INSTANCE.sqlType());
} else {
st.setString(index, ((Enum) value)。name());
}
}
}