在我们的应用程序中,我们从 DB2 大型机数据库中提取数据。如果数据库在某个字段中有“低值”,hibernate 在对象中发送一个“空”值。即使该列被定义为“非空”,也会发生这种情况。
当我们对此进行 XML 解析时,Castor 遇到了麻烦。我想在 Hibernate 中解决这个问题。另外,所有的hibernate hbm文件都是生成的,所以我们不能乱用它们(它们会时不时地重新生成。)
有什么方法可以拦截所有字符串并将空值替换为""
?
null
替换""
reveng.xml
.这是我们(@Betlista 和@markthegrea的学分)提出的解决方案。实际上,这是一个大写的并且被截断(很多抽象方法被删除)。
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>
您可以使用扩展 EmptyInterceptor 的休眠拦截器在实际触发该查询之前执行您想要的操作。
此处给出的示例可能会对您有所帮助
http://www.mkyong.com/hibernate/hibernate-interceptor-example-audit-log/
我通过在连接器设置器中处理数据库 NULL 值来解决我这边的相同问题,就像这里建议的那样,使用一个简单的
/**
* Set the value related to the column: NOM
* @param nom the NOM value
*/
public void setNom (String nom) {
this.nom = (nom!= null) ? nom : "" ;
}