使用自定义用户类型解决Hibernate,DB2,Derby的布尔值转换问题

迷途d书童 发布于 2012/06/29 16:12
阅读 1K+
收藏 6
最近我们的团队开始使用 Derby进行本地开发,然而我们的生产数据库是 DB2。好消息是,这些SQL语句几乎是一样的,可以不用去修改它们。不过,我们还是遇到了问题,就是我们的布尔类型字段。使用的DB2驱动并定义列为char(1),默认情况下,一个布尔对象的默认值为“1”和“0”(或1和0),但是当使用 Derby JDBC驱动程序连接DB2并使用Hibernate时,这些值被翻译为“true”与“false”,这是无法将四个字符保存在一个字符的字段中的。JIRA解释说这种行为实际上是有必要的,就像Derby使用DB2 type2驱动程序代替DB2 type4通用驱动程序。

用google搜索该问题后,原来很多人都遇到这样的问题,但没有明确的解决方案。我们能找到的最好的方法,就是使用Hibernate 3.5创建一个自定义的用户类型(基于Hibernate YesNoType),告诉Hibernate注明我们所有的布尔值类型映射到的字段。以下是我们的用户类型的最终代码(基于YesNoType)。
package org.shamalamading.dong;

public class OneZeroType extends org.hibernate.type.CharBooleanType {


    protected final java.lang.String getTrueString() {
        return "1";
    }

    protected final java.lang.String getFalseString() {
        return "0";
    }

    public java.lang.String getName() {
        return "OneZeroType";
    }
}

然后修改我们的Hibenate实体,使用这种类型,如下:
package org.shamalamading.dong;
@Entity
@Table(name = "REPORT_TBL")
public class Report implements Serializable {
    @Column(name = "ACTIVE_FLAG", columnDefinition="char(1)")
    @Type(type="org.shamalamading.dong.OneZeroType")
    private Boolean active;
    public Boolean getActive() {
        return this.active;
    }
    public void setActive(Boolean newValue) {
        this.active = newValue;
    }

}

现在,当持久化到数据库并设置值时,Hibernate将设置“1”为true ,“0”为false。这将更好的让Derby和DB2在一起工作,因为不同的本地驱动处理布尔值不同。另外一个,我觉得有趣的是DB2(或数据库)方面,似乎普遍认同“0”或0代表“false”,但在编程方面,通常认为0来代表“true”,而“其它”表示“false”。

 

原文链接OSChina.NET编译

加载中
0
魔力猫
魔力猫
第一次看到0代表true的。0代表false从C时代就是false了。
0
开车中国
开车中国
现在几乎都是0表示false,非0表示true。
0
R-Lu
R-Lu
有的时候用枚举的飘过,不过我感觉,Oracle好像没有这个方面的事情嘛.
返回顶部
顶部