在我们的应用程序中,我们从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>
这是我们的第一个想法,也是我们可能实现的目标。我希望方言或配置改变,但这可能是我们能得到的最好的。谢谢! – markthegrea 2010-04-15 14:52:08
@sliver我不知道在方言级别的东西(这个调整看起来太具体以至于不在方言中),但我可能是错的。我的感觉是UserType是实现这一点的方式。 – 2010-04-15 15:50:09