我目前正在尝试让 Hibernate 使用 Oracle 8 Legacy-Database。到目前为止一切正常,但现在我遇到了一个尚未解决的问题:数据库中的布尔值未保存为 'y'/'n' 或 't'/'f' 或 0/1 格式,但是因为该项目来自西班牙语地区,所以它被保存为 's'/'n' 表示 si/no。但是,Hibernate 显然不支持这一点。
有任何想法吗?我会感谢每一个正确方向的小指针。例如布尔映射是哪个类,所以我可以覆盖它/创建我自己的版本?
提前致谢。
AFAIK,您必须使用自己的 Dialect 类,扩展您当前使用的 Dialect 类,并覆盖 method toBooleanValueString()
。
我知道的另一个扩展点是使用合同
org.hibernate.usertype.UserType
您需要实现的更重要的方法是 nullSafeSet 和 nullSafeGet。这些提供了必要的钩子,以便在 Hibernate “水合”对象之前将值从 ResultSet 转换为 java 对象,反之亦然。
例如
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
String value = rs.getString(names[0]);
if(value==null) {
//handle this
}
//handle other possibilities like Si/No or whatever here
return "s".equals(value) ? Boolean.TRUE : Boolean.FALSE;
}
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws HibernateException, SQLException {
if (value==null) {
//handle this
return;
}
Boolean bValue = (Boolean) value;
if(bValue) {
st.setString("s", index);
} else {
st.setString("n", index);
}
//handle other possibilities like Si/No or whatever here
}
然后,让 Hibernate 知道您的 UserType 实现是一件简单的事情,您可以在 hibernate 映射中将其作为 typedef 元素执行,或者简单地使用 UserType 适用的属性元素的 type 属性。
这就是我在 Hibernate 中定义自定义类型的方式
public class CustomBooleanType extends BooleanType {
public static final String TRUE = "s";
public static final String FALSE = "n";
public CustomBooleanType () {
super(CharTypeDescriptor.INSTANCE, new BooleanTypeDescriptor(TRUE.charAt(0), FALSE.charAt(0)));
}
}