18

在不同数据库之间切换时,我对包含大对象 (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

和吸气剂一样,如果有办法做到这一点

编辑:

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

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

3 回答 3

12

这个字段映射在org.hibernate.dialect.PostgreSQLDialectpostgres 中定义并且可以通过子类化并配置您的应用程序以使用修改后的方言来更改。

子类中的相关咒语可能是

    registerColumnType( Types.BLOB, "bytea" );

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

于 2010-12-20T11:05:40.457 回答
1

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

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

工作得很好。比那更新失败...

于 2018-01-30T21:37:04.513 回答
1

自 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了解更多信息。

于 2020-09-10T11:22:49.297 回答