JSP中Hibernate映射枚举为字符串的hbm.xml实现

0 下载量 139 浏览量 更新于2024-08-29 收藏 54KB PDF 举报
在JSP开发中,当Java Bean对象(如`Gender`枚举类型)需要映射到数据库时,如果希望将枚举值存储为字符串格式而非默认的枚举ID,可以使用Hibernate的自定义映射以及UserType。下面详细介绍如何在`hbm.xml`配置文件中实现这一需求,并创建一个自定义的`GenderUserType`。 首先,我们需要定义Java Enum类型`Gender`,它包含未知(`UNKNOWN`)、男性(`MALE`)和女性(`FEMALE`)三个状态,并将它们的字符串表示分别赋值给相应的枚举成员: ```java public enum Gender { UNKNOWN("Unknown"), MALE("Male"), FEMALE("Female"); private String key; private Gender(String key) { this.key = key; } // 提供get方法用于查找对应的枚举实例 public static Gender getByKey(String key) { for (Gender gender : values()) { if (key.equalsIgnoreCase(gender.getKey())) { return gender; } } throw new NoSuchElementException("Invalid gender key: " + key); } } ``` 接下来,为了使Hibernate能够正确处理`Gender`枚举的字符串映射,我们创建一个自定义的`GenderUserType`实现`UserType`接口: ```java public class GenderUserType implements UserType { private static int[] typeList = {Types.VARCHAR}; // 使用VARCHAR类型 // 返回映射字段的SQL类型 @Override public int[] sqlTypes() { return typeList; } // 返回映射的Java类 @Override public Class returnedClass() { return Gender.class; } // 声明Gender类是不可变的 @Override public boolean isMutable() { return false; } // 其他必要的UserType方法,例如deepCopy、nullSafeGet等,这里省略 // 自定义的nullSafeGet方法,根据数据库中的字符串获取对应的Gender枚举 @Override public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException { String genderStr = rs.getString(names[0]); return Gender.getByKey(genderStr); } // 自定义的nullSafeSet方法,将Gender枚举转换为字符串存储到数据库 @Override public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException { Gender gender = (Gender) value; st.setString(index, gender.getKey()); } } ``` 在`hbm.xml`配置文件中,你需要为`Gender`类型的字段添加一个`user-type`元素,指定使用`GenderUserType`: ```xml <class name="YourEntity" table="your_table_name"> <id name="id" type="long" column="id"></id> <!-- 假设字段名为gender --> <property name="gender" type="com.your.package.GenderUserType" column="gender_str"/> </class> ``` 通过这种方式,当在JSP或Java代码中操作`Gender`枚举时,Hibernate会自动将其转换为字符串并存储到数据库中,同时查询时也能根据字符串找到对应的枚举实例。这样就实现了Java Enum类型`Gender`在JSP中与Hibernate的映射,满足了将枚举值以字符串形式持久化的需求。