例如public enum Gender {
   MAN, WOMAN
}public class Person {private int id;
private Gender gender;}我想将索引0,1映射到数据库。用xml怎么配置??不要annotation方式,只要xml方式

解决方案 »

  1.   

    Hibernate提供了自定义类型的映射问题,可看相关的书,具体做一下,会有点复杂。
      

  2.   

    Annotation方式挺好的.映射枚举也就一句话搞定. 干嘛不用,又不是没源码
      

  3.   


    公司项目经理要求不能使用Annotation,一定要xml配置方式
      

  4.   

    那你试试看这个能不能帮上你。
    http://www.examda.com/ncre2/JAVA/fudao/20081125/084646793.html
      

  5.   

    用annotation那是相当简单,用xml就麻烦了,得自己实现类转...
      

  6.   

    那你试试看这个能不能帮上你。
    http://www.examda.com/ncre2/JAVA/fudao/20081125/084646793.html
      

  7.   

    <property name="myfield" length="30">
    <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包里面。
      

  8.   

    这里是枚举public enum Sex implements IntegerValuedEnum{ 女(0), 男(1);

    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>