2010-04-14 189 views
2

在我们的应用程序中,我们从DB2大型机数据库中提取数据。如果数据库在字段中有“低值”,hibernate会在对象中发送一个“null”值。即使该列被定义为“不为空”,也会发生这种情况。Hibernate可以将空字符串默认为空字符串

由于我们正在对此进行XML解析,因此Castor遇到了问题。我想在Hibernate中解决这个问题。而且,所有的hibernate hbm文件都会生成,所以我们不能混淆它们(它们会不时被重新整理)。

任何拦截所有字符串并用“”替换空值的方法?

这是我们想出的解决方案。实际上,这是一个大写字母并被截断(大量的抽象方法被删除)。

public class UpperCaseUserType implements org.hibernate.usertype.UserType{ 
    private static final int[] TYPES = {Types.VARCHAR}; 

    public Object nullSafeGet(ResultSet resultSet, String[] strings, Object object) throws HibernateException, SQLException { 
     //This might be redundant to uppercase the getter... 
     return StringUtils.upperCase((String) Hibernate.STRING.nullSafeGet(resultSet, strings[0])); 
    } 
    public void nullSafeSet(PreparedStatement preparedStatement, Object object, int i) throws HibernateException, SQLException { 
     String string = StringUtils.upperCase((String) object); 
     Hibernate.STRING.nullSafeSet(preparedStatement, string, i); 
    } 
} 

然后你把它挂这样:

<property name="partNumber" type="cat.dds.fpsdma.model.UpperCaseUserType"> 
     <column name="PART_NUMBER" length="20" not-null="true" /> 
</property> 

回答

2
  • 创建自定义的用户类型与""
  • 更换null把用户类型名称,你通常在reveng.xml把Hibernate类型的名字。
+0

这是我们的第一个想法,也是我们可能实现的目标。我希望方言或配置改变,但这可能是我们能得到的最好的。谢谢! – markthegrea 2010-04-15 14:52:08

+0

@sliver我不知道在方言级别的东西(这个调整看起来太具体以至于不在方言中),但我可能是错的。我的感觉是UserType是实现这一点的方式。 – 2010-04-15 15:50:09