6

我目前正在尝试让 Hibernate 使用 Oracle 8 Legacy-Database。到目前为止一切正常,但现在我遇到了一个尚未解决的问题:数据库中的布尔值未保存为 'y'/'n' 或 't'/'f' 或 0/1 格式,但是因为该项目来自西班牙语地区,所以它被保存为 's'/'n' 表示 si/no。但是,Hibernate 显然不支持这一点。

有任何想法吗?我会感谢每一个正确方向的小指针。例如布尔映射是哪个类,所以我可以覆盖它/创建我自己的版本?

提前致谢。

4

3 回答 3

2

AFAIK,您必须使用自己的 Dialect 类,扩展您当前使用的 Dialect 类,并覆盖 method toBooleanValueString()

于 2012-11-23T14:02:29.237 回答
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 属性。

于 2012-11-23T14:32:13.417 回答
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)));
   }  
}
于 2012-11-23T14:39:34.723 回答