Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何使用hibernate和遗留数据库从字符字段pojo中修剪空白_Spring_Hibernate_Orm_Hibernate Mapping - Fatal编程技术网

Spring 如何使用hibernate和遗留数据库从字符字段pojo中修剪空白

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注释提供生命

我的表的列为char(5),无法将其更改为varchar(5)。因此,当我使用hibernateTemplate从表中提取值时,它会返回带有实际值(比如单个字母值)的附加空格(自定义修复是使用.trim()方法检查NPE),但我们是否提供了处理这种情况的方法。 另外,我使用Spring支持来支持hibernate dao。
(在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);
  }