【问题标题】:Hibernate, Postgresql: Column "x" is of type oid but expression is of type byteHibernate,Postgresql:列“x”的类型为oid,但表达式的类型为字节
【发布时间】:2011-05-28 04:25:42
【问题描述】:

在不同数据库之间切换时,我遇到了一个关于包含大对象 (BLOB) 的休眠映射的奇怪问题。

@Lob
private byte[] binaryData;

上面的字段在 MySQL 和 Oracle 中创建了一个字节数组字段,但是在 PostreSQL 中它创建了一个 oid 类型的字段。

现在,当我尝试访问此字段时,它在其他数据库中工作正常,但在 PostgreSQL 中失败并出现以下错误

Column "binaryData" is of type oid but expression is of type bytea.

所以我尝试简单地删除“@Lob”注释,这将解决 PostgreSQL 的问题,但是在没有这个注释的 MySQL 中,hibernate 创建了一个类型为“tinyblob”的字段,在我们的大多数情况下它都很小.而且,由于我们想在多个环境中使用这个项目,所以要切换两种不同的映射是很烦人的。

是否有任何注释强制 postgreSQL 对使用 @Lob 注释的字段使用 bytea 而不是 oid?或者是否有可能省略@Lob并放置其他内容以强制MySQL为其分配更大的数据类型,就像使用@Lob一样?

我什至可以想象有这样的解决方案

if (field is of type oid)
  store it as oid
else if (field is of type bytea)
  store it as bytea
else
  // not storable

如果有办法做到这一点,则与 getter 相同

编辑:

以下声明有效。它将列分配为 oid,但是使用它的休眠知道如何从这样的字段存储和检索数据

@Lob
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
private byte[] binaryFile;

【问题讨论】:

    标签: hibernate postgresql annotations bytearray oid


    【解决方案1】:

    此字段映射在org.hibernate.dialect.PostgreSQLDialect 中定义,可以通过对其进行子类化并将您的应用配置为在使用 postgres 运行时使用修改后的方言来进行更改。

    子类中的相关咒语大概就是放

        registerColumnType( Types.BLOB, "bytea" );
    

    在你的构造函数中调用super()

    【讨论】:

    • 嗨,唐!谢谢您的回答。我试过了,效果很好,但同时我发现了一个简单的解决方案,我将其添加到问题中
    【解决方案2】:

    对我来说,这可能意味着曾经“将您的 postgres jdbc 版本恢复到 9.3-1101.jdbc4”

      <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4-1200-jdbc41</version>
      </dependency>
    

    同样有效。比那更新失败...

    【讨论】:

      【解决方案3】:

      该类自 Hibernate 3.6 起已弃用。现在使用最新的 Hibernate,我们需要改用 @Type(type="org.hibernate.type.MaterializedBlobType")。请查看https://docs.jboss.org/hibernate/core/3.6/javadocs/deprecated-list.htmlhttps://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/type/MaterializedBlobType.html 了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-19
        • 2018-03-31
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        • 1970-01-01
        • 2015-01-01
        • 2023-03-15
        相关资源
        最近更新 更多