Spring 如何使用hibernate和遗留数据库从字符字段pojo中修剪空白
我的表的列为char(5),无法将其更改为varchar(5)。因此,当我使用hibernateTemplate从表中提取值时,它会返回带有实际值(比如单个字母值)的附加空格(自定义修复是使用.trim()方法检查NPE),但我们是否提供了处理这种情况的方法。 另外,我使用Spring支持来支持hibernate dao。Spring 如何使用hibernate和遗留数据库从字符字段pojo中修剪空白,spring,hibernate,orm,hibernate-mapping,Spring,Hibernate,Orm,Hibernate Mapping,我的表的列为char(5),无法将其更改为varchar(5)。因此,当我使用hibernateTemplate从表中提取值时,它会返回带有实际值(比如单个字母值)的附加空格(自定义修复是使用.trim()方法检查NPE),但我们是否提供了处理这种情况的方法。 另外,我使用Spring支持来支持hibernate dao。 (在SQL中,字符数据类型是一个固定长度的字符串。根据定义,附加字符用空格填充。)避免显式调用trim()的一种方法是,您可以在自己的权限中使用@PostLoad注释提供生命
(在SQL中,字符数据类型是一个固定长度的字符串。根据定义,附加字符用空格填充。)避免显式调用trim()的一种方法是,您可以在自己的权限中使用
@PostLoad
注释提供生命周期方法。
例如:
我已经提到了关于这个问题的讨论 在建议的解决方案中,我认为添加用户类型最符合要求,而且更有意义,因为 1. @PostLoad(或者实际上是生命周期方法)不能与hibernate一起使用SessionFactory。 2.在代码折射期间,assessor中的修改可能会被忽略,而另一个开发人员可能会忽略setter,这可能会导致覆盖setter 所以我使用下面的解决方案。 1.有一个包-info.java:-这有正在使用的typedefs的详细信息。 2.用@Type(Type=“MyTrimTypeString”)注释字段 3.定义了一个用户类型类MyTrimTypeString,并对nullSafeGet进行了轻微更新,如下所示
@Override
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException
{
final String val = rs.getString(names[0]);
return (val == null ? val : val.trim());
}
nullSafeSet看起来像:
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException
{
final String val = (String)value;
st.setString(index, val);
}
这与提供setter方法非常相似。这并没有错,但正在寻找一些通用的解决方案如果将此操作移动到setters/getter,那么在初始加载时以及每次后续调用方法时都会进行此检查。在这种方法中,只有在初始加载时才会执行此操作。在使用hibernate方式的会话工厂的地方,永远不会调用@PostLoad。请参阅[链接]()
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException
{
final String val = (String)value;
st.setString(index, val);
}