【问题标题】:Hibernate Not Loading Postgresql bytea consistentlyHibernate 没有一致地加载 Postgresql bytea
【发布时间】:2010-12-02 12:42:33
【问题描述】:

我在两个不同的机器上使用 Hibernate 3.6,它们都从完全相同的数据库表中读取。两个字段的Hibernate注解是这样的:

@Basic(fetch=FetchType.EAGER)
@Column(name="encryptedkey",length = 256)
protected byte[] encryptedKey;

@Basic(fetch=FetchType.EAGER)
@Column(name="encryptediv",length = 256)
protected byte[] encryptedIV;

现在,当在一台机器(带有 Sun JDK 1.6.0_22-b04 的 Ubuntu Linux)上加载具有这些属性的实体时,我能够加载 256 字节的加密密钥和 IV。

但是,在另一台机器(带有 Sun JVM 1.6.0_22-b04 的 Windows 2003 服务器 SP2 企业版)上情况并非如此,我为每个字段加载了 0 或 511 个字节。否则,两个系统上的jar文件都是一样的。

数据库引擎是 PostgreSQL 9.0,我使用的是最新的 PostgreSQL JDBC 驱动程序。

有人知道可能出了什么问题吗?

【问题讨论】:

  • postgre 的列类型是数组?
  • postgre中的类型是bytea
  • 尝试了一些故障排除步骤:升级 JVM,升级 Hibernate 1.6 库,降级到 Hibernate 3.3.2,从 infinispan 更改为 ehcache。我还尝试使用 JDBC3 和 JDBC4 驱动程序,结果相同。这些事情都没有改变任何东西。
  • 我会尝试在调试器中运行它,并在处理这些的 Hibernate 类型实现的 nullSafeGet() 方法中设置断点...看看从 JDBC 驱动程序返回的内容是否正常或不是,所以您至少可以判断它是 Hibernate 还是 JDBC 驱动程序问题。您可能还会发现正在使用的类型不是您期望或想要的。
  • 也许这应该是一个答案?但它并没有真正回答任何问题......

标签: java hibernate postgresql


【解决方案1】:

原来 JRE lib 文件夹中有一个 PosgreSQL 8.4 驱动程序。删除它解决了这个问题。

【讨论】:

  • 可能是由于 bytea 转义格式发生了变化,那么。在服务器上将bytea_output 设置为“escape”也可以解决这个问题,以防您必须在无法使用 JRE 的地方再次执行此操作。
  • 好点。如果无法删除该驱动程序,则必须撤消该驱动程序所做的转义。性能大受打击。
【解决方案2】:

最终解决方案:

ALTER DATABASE myAmazingDbOnALinuxServer SET bytea_output = 'escape'; 

PD:此变量可能与 Windows 上安装的 Postgre 的备份不兼容,将对包含 bytea 列的表的每一行抛出 COPY 错误。

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2023-01-08
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多