关于网友提出的“使用自定义用户类型解决Hibernate,DB2,Derby的布尔值转换问题”问题疑问,本网通过在网上对“使用自定义用户类型解决Hibernate,DB2,Derby的布尔值转换问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题:使用自定义用户类型解决Hibernate,DB2,Derby的布尔值转换问题
描述:最近我们的团队开始使用
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编译
解决方案1:有的时候用枚举的飘过,不过我感觉,Oracle好像没有这个方面的事情嘛.
解决方案2:现在几乎都是0表示false,非0表示true。
解决方案3:第一次看到0代表true的。0代表false从C时代就是false了。
以上介绍了“使用自定义用户类型解决Hibernate,DB2,Derby的布尔值转换问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/1318290.html