Hibernate:将布尔映射更改为's'/'n'?

时间:2012-11-23 13:53:01

标签: java hibernate

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

有什么想法吗?我会感谢每一个指针朝着正确的方向前进。例如哪个类执行布尔映射,所以我可以覆盖它/创建我自己的版本吗?

提前致谢。

3 个答案:

答案 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)));
   }  
}