Я использую Oracle 10g и Hibernate 2.1 (старая версия, но не разрешено обновлять, чтобы исправить). У меня есть таблица с необнуляемым столбцом с именем TIN, varchar2 (9). Этот столбец используется для размещения данных, загружаемых из плоских файлов, и поэтому может хранить любую строку длиной 9, включая 9 пробелов (то есть: ''), если входной файл имеет 9 пробелов.
Что я заметил, так это:
Oracle 10g автоматически преобразует пустые строки в NULL. Так что если вы выполните:
SELECT NVL('', 'Input string converted to NULL') FROM dual;
Результатом является 'Входная строка, преобразованная в NULL', а не ''. Я думаю, что это имеет отношение к проблеме.
Когда Hibernate считывает запись, в которой значение TIN составляет 9 пробелов (или любое количество пробелов) без других символов, оно сохраняет значение в памяти как ''. Затем, похоже, Hibernate заставляет себя задуматься, так что значение изменилось с 9 пробелов на пустую строку. Затем, если запись записывается обратно в базу данных, Hibernate пытается записать пустую строку, а не 9 пробелов, и Oracle, очевидно, преобразует ее в ноль, а затем выбрасывает ненулевое ограничение ограничения.
Для справки, вот HBM для этого столбца:
<property
name="tin"
type="java.lang.String"
column="TIN"
not-null="true"
length="9">
У меня вопрос: как я могу указать Hibernate не преобразовывать значения, содержащие только пробелы, в пустые строки?
Обновление 1: я только что вернулся и протестировал строки типа 'text' и обнаружил, что Hibernate также обрезает эти пробелы, делая строку 'text' и обманывая себя, думая, что значение изменилось. Я должен что-то упустить. Это не похоже на поведение по умолчанию.
Обновление 2. Похоже, что задача Ant hbm2java, которая преобразует HBM в исходный код Java, может быть источником обрезки строки. Все еще расследую.
Спасибо,
Джефф
Редактировать: изменена формулировка вопроса, чтобы быть более точной.