【问题标题】:Hibernate 3.3.2GA improperly loads bytea data from PostgreSQL 9.0 and all type mappings are correctHibernate 3.3.2GA 不正确地从 PostgreSQL 9.0 加载 bytea 数据并且所有类型映射都是正确的
【发布时间】:2011-06-19 14:51:34
【问题描述】:

您可能将 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 已将其默认 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'
...

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

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

由于十六进制更容易阅读,有谁知道如何配置 Hibernate 3.3.2GA 以理解十六进制格式?

【问题讨论】:

  • 当您使用旧的休眠版本时 - 您是否还使用旧的 postgresql 驱动程序?直到一年或两年前才添加正确处理 bytea hex。
  • 谢谢。我们正在使用 hibernate-spatial,尚未发布并支持 Hbernate 3.6。整个套件与旧软件包相互依赖:在本例中为 postgresql-8.4-701.jdbc3.jar。似乎与 9.0 一起工作,但这是粗心的陷阱。

标签: hibernate postgresql


【解决方案1】:

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

这个问题已于去年 5 月在 PostgreSQL JDBC 驱动程序中得到修复,因此您应该能够简单地升级它。见:http://jdbc.postgresql.org/changes.html#version_9.0-dev800

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2020-01-01
相关资源
最近更新 更多