Hibernate 3.3.2GA不正确地从PostgreSQL 9.0加载bytea数据,并且所有类型映射都是正确的

Jim*_*Jim 3 postgresql hibernate

您可能将bytea列映射为Hibernate类型二进制.在java中,bytea数据适当地表示为byte [].

设置数据时,它会正确显示在PostreSQL 9.0数据库中.

例如:

            set( [ 1, 2, 0, 1, 255, 0 ] )
Run Code Online (Sandbox Code Playgroud)

在正常的SQL查询输出中显示如下:

             \x010201ff00
Run Code Online (Sandbox Code Playgroud)

当Hibernate调用java set()例程加载数据时,数据不正确.除第一个字节外的所有字节都更改为字节值的ASCII表示形式.set()函数的断点并观察Hibernate调用:

           set( [ 1, 50, 48, 49, 102, 102, 48 ] )
Run Code Online (Sandbox Code Playgroud)

等效:

           set( [ 1, '2', '0', '1', 'f, 'f', '0' ] )
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 9.0已将其默认的bytea输出从'escape'更改为'hex'.这混淆了(至少)9.0之前版本的hibernate.

要解析,请编辑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'
...
Run Code Online (Sandbox Code Playgroud)

您的SQL查询数据现在也将以更传统的八进制形式显示:

\001\002\000\001\377\000
Run Code Online (Sandbox Code Playgroud)

由于hex更易于阅读,任何人都知道如何配置Hibernate 3.3.2GA来理解十六进制格式?

ara*_*nid 6

问题不在于Hibernate本身,而在于需要解码这些东西的PostgreSQL JDBC驱动程序.这是一个已知问题,例如Perl中的DBD :: Pg也是如此.

去年五月在PostgreSQL JDBC驱动程序中修复了这个问题,所以你应该可以简单地升级它.请参阅:http://jdbc.postgresql.org/changes.html#version_9.0-dev800