一尘不染

Hibernate,PostgreSQL:列“ x”是oid类型,但表达式是byte类型

hibernate

在不同数据库之间进行切换时,关于包含大对象(BLOB)的hibernate映射,我有一个奇怪的问题。

@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使用bytea而不是oid来使用@Lob注释的字段的注释?或者是否有可能省略@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,但是使用它的hibernate方式知道如何存储和检索此类字段中的数据

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

阅读 643

收藏
2020-06-20

共1个答案

一尘不染

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

子类中的相关咒语可能是

    registerColumnType( Types.BLOB, "bytea" );

在构造函数中调用super()

2020-06-20