Hibernate 3.3.2GA неправильно загружает байтовые данные из PostgreSQL 9.0, и все сопоставления типов верны - PullRequest
3 голосов
/ 02 февраля 2011

У вас может быть столбец bytea, отображаемый как двоичный файл типа Hibernate. В Java данные bytea соответственно представлены как byte [].

Когда вы устанавливаете данные, они правильно отображаются в вашей базе данных PostreSQL 9.0.

Например:

            set( [ 1, 2, 0, 1, 255, 0 ] )

Показывает в нормальном выводе SQL-запроса как:

             \x010201ff00

Когда Hibernate вызывает вашу подпрограмму java set () для загрузки данных, они неверны. Все, кроме первого байта, заменены на ASCII-представление значения байта. Точка останова в функции set () и наблюдение за вызовом Hibernate с помощью:

           set( [ 1, 50, 48, 49, 102, 102, 48 ] )

эквивалентно:

           set( [ 1, '2', '0', '1', 'f, 'f', '0' ] )

PostgreSQL 9.0 изменил свой вывод байтов по умолчанию с 'escape' на 'hex'. Это смущает (по крайней мере) версии спящего режима до 9.0.

Для разрешения отредактируйте файл postgresql.conf и измените настройку «bytea_output» с «hex» на «escape», восстановив старый формат вывода. Перезагрузите сервер.

...
#vacuum_freeze_min_age = 50000000
#vacuum_freeze_table_age = 150000000
bytea_output = 'escape'         # hex, escape  escape is REQUIRED BY  HIBERNATE 3.3.2GA
#xmlbinary = 'base64'
#xmloption = 'content'
...

Ваши данные SQL-запроса теперь также будут отображаться в более традиционной восьмеричной форме:

\001\002\000\001\377\000

Поскольку hex легче читать, кто-нибудь знает, как настроить Hibernate 3.3.2GA для понимания шестнадцатеричного формата?

1 Ответ

6 голосов
/ 02 февраля 2011

Проблема не в Hibernate как таковом, а в драйвере JDBC PostgreSQL, который должен декодировать этот материал. Это известная проблема, то же самое происходит, например, с DBD :: Pg в Perl.

Эта проблема была исправлена ​​в драйвере JDBC PostgreSQL в мае прошлого года, поэтому вы можете просто обновить его. Смотри: http://jdbc.postgresql.org/changes.html#version_9.0-dev800

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...