2010-04-14 1 views
2

В нашем приложении мы извлекаем данные из базы данных мейнфреймов DB2. Если база данных имеет «низкие значения» в поле, hibernate отправляет «нулевое» значение в объекте. Это происходит, даже если столбец определяется как «не null».Может Hibernate по умолчанию для Null String для пустой строки

Поскольку мы делаем синтаксический анализ XML на этом, у Кастора возникают проблемы с ним. Я хотел бы исправить это в Hibernate. Кроме того, генерируются все файлы hibm hibernate, поэтому мы не можем с ними общаться (они время от времени обновляются).

Любой способ перехватить все строки и заменить нули на ""?

Вот решение, с которым мы столкнулись. На самом деле, это верхний регистр и усечен (многие абстрактные методы удалены).

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 ,
+0

Это была наша первая мысль и та, которую мы, вероятно, будем реализовывать до сих пор. Я надеялся на Диалект или изменение конфигурации, но это может быть лучшее, что мы можем получить. Благодаря! – markthegrea

+0

@sliver Я не знаю о чем-то подобном на уровне диалекта (эта настройка кажется слишком специфичной, чтобы быть на диалекте), но я могу ошибаться. Я чувствую, что UserType - это способ реализовать это. –

0

Вы можете использовать спящий режим перехватчик, который проходит EmptyInterceptor для выполнения операции, которую вы хотите, прежде чем на самом деле стрелять этот запрос.

пример, приведенный здесь может помочь вам

http://www.mkyong.com/hibernate/hibernate-interceptor-example-audit-log/

+0

Я считаю, что это не срабатывает при выборе утверждений ... – markthegrea