例如public enum Gender {
MAN, WOMAN
}public class Person {private int id;
private Gender gender;}我想将索引0,1映射到数据库。用xml怎么配置??不要annotation方式,只要xml方式
MAN, WOMAN
}public class Person {private int id;
private Gender gender;}我想将索引0,1映射到数据库。用xml怎么配置??不要annotation方式,只要xml方式
公司项目经理要求不能使用Annotation,一定要xml配置方式
http://www.examda.com/ncre2/JAVA/fudao/20081125/084646793.html
http://www.examda.com/ncre2/JAVA/fudao/20081125/084646793.html
<type name="org.hibernate.type.EnumType">
<param name="enumClass">org.judge.myenum</param>
<param name="type">12</param>
</type>
</property> 注意,org.hibernate.type.EnumType在hibernate-annotations包里面。
private int code;
private Sex(int code) {
this.code = code;
} @Override
public int getCode() {
return code;
}}定义一个接口
public interface IntegerValuedEnum {
int getCode();
}
定义一个反射类@SuppressWarnings("unchecked")
public final class IntegerValuedEnumReflect {
private IntegerValuedEnumReflect() {
throw new UnsupportedOperationException(
"This class must not be instanciated.");
}
private static <T extends Enum> T[] getValues(Class<T> enumClass) {
return enumClass.getEnumConstants();
}
public static <T extends Enum & IntegerValuedEnum> int[] getStringValues(
Class<T> enumClass) {
T[] values = getValues(enumClass);
int[] result = new int[values.length];
for (int i = 0; i < values.length; i++) {
result[i] = values[i].getCode();
}
return result;
}
public static <T extends Enum & IntegerValuedEnum> String getNameFromValue(
Class<T> enumClass, int value) {
T[] values = getValues(enumClass);
for (int i = 0; i < values.length; i++) {
if (values[i].getCode() == value) {
return values[i].name();
}
}
return "";
}
}
关键类,实现了EnhancedUserType接口与ParameterizedType接口。不能用实现UserType借口,否则不能从数据库拿数据
@SuppressWarnings("unchecked")
public class IntegerValuedEnumType<T extends Enum & IntegerValuedEnum>
implements EnhancedUserType, ParameterizedType { /**
* Enum class for this particular user type.
*/
private Class<T> enumClass; /**
* Value to use if null.
*/
private Integer defaultValue; public IntegerValuedEnumType() {} public void setParameterValues(Properties parameters) {
String enumClassName = parameters.getProperty("enum");
try {
enumClass = (Class<T>) Class.forName(enumClassName)
.asSubclass(Enum.class).asSubclass(IntegerValuedEnum.class);
} catch (ClassNotFoundException e) {
throw new HibernateException("Enum class not found", e);
} String defaultValueStr = parameters.getProperty("defaultValue");
if (defaultValueStr != null && !defaultValueStr.isEmpty()) {
try {
setDefaultValue(Integer.parseInt(defaultValueStr));
} catch (NumberFormatException e) {
throw new HibernateException("Invalid default value", e);
}
}
} public Integer getDefaultValue() {
return defaultValue;
} public void setDefaultValue(Integer defaultValue) {
this.defaultValue = defaultValue;
} /**
* The class returned by <tt>nullSafeGet()</tt>.
*
* @return Class
*/
public Class returnedClass() {
return enumClass;
} public int[] sqlTypes() {
return new int[] { Types.TINYINT };
} public boolean isMutable() {
return false;
} /**
* Retrieve an instance of the mapped class from a JDBC resultset.
* Implementors should handle possibility of null values.
*
* @param rs a JDBC result set
* @param names the column names
* @param owner the containing entity
* @return Object
* @throws HibernateException
* @throws SQLException
*/
public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
throws SQLException { Integer value = rs.getInt(names[0]);
if (value == null) {
value = getDefaultValue();
if (value == null) { // no default value
return null;
}
}
String name = IntegerValuedEnumReflect.getNameFromValue(enumClass,
value);
Object res = rs.wasNull() ? null : Enum.valueOf(enumClass, name); return res;
} /**
* Write an instance of the mapped class to a prepared statement.
* Implementors should handle possibility of null values. A multi-column
* type should be written to parameters starting from <tt>index</tt>.
*
* @param st a JDBC prepared statement
* @param value the object to write
* @param index statement parameter index
* @throws HibernateException
* @throws SQLException
*/
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws SQLException { if (value == null) {
st.setNull(index, Types.TINYINT);
} else {
st.setInt(index, ((T) value).getCode());
}
} public Object assemble(Serializable cached, Object owner) {
return cached;
} public Serializable disassemble(Object value) {
return (Enum) value;
} public Object deepCopy(Object value) {
return value;
} public boolean equals(Object x, Object y) {
return x == y;
} public int hashCode(Object x) {
return x.hashCode();
} public Object replace(Object original, Object target, Object owner) {
return original;
} public String objectToSQLString(Object value) {
return '\'' + String.valueOf(((T) value).getCode()) + '\'';
} public String toXMLString(Object value) {
return String.valueOf(((T) value).getCode());
} public Object fromXMLString(String xmlValue) {
Integer value = Integer.parseInt(xmlValue);
String name = IntegerValuedEnumReflect.getNameFromValue(enumClass,
value);
return Enum.valueOf(enumClass, name);
}
}
这里是配置文件
<property name="sex">
<column name="SEX" not-null="true"></column>
<type name="com.ce.util.orm.enums.IntegerValuedEnumType">
<param name="enum">com.ce.demo.domain.Sex</param>
</type>
</property>