我目前正在尝试让Hibernate使用Oracle 8 Legacy-Database。 到目前为止一切正常,但现在我遇到了一个尚未解决的问题: 布尔值数据库中的值不是以'y'/'n'或't'/'f'或0/1格式保存,而是因为项目来自讲西班牙语的区域,它保存为's'/' n'为si / no。但是,Hibernate显然不支持这一点。
有什么想法吗?我会感谢每一个指针朝着正确的方向前进。例如哪个类执行布尔映射,所以我可以覆盖它/创建我自己的版本吗?
提前致谢。
答案 0 :(得分:2)
AFAIK,您必须使用自己的Dialect类,扩展您当前使用的Dialect类,并覆盖方法toBooleanValueString()
。
答案 1 :(得分:2)
我知道的另一个扩展点是使用合同
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属性。
答案 2 :(得分:1)
这就是我通过在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)));
}
}