在不同数据库之间切换时,我在包含大物体(BLOB)的冬眠映射方面有一个奇怪的问题。

@Lob
private byte[] binaryData;

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

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

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

因此,我试图简单地删除“ @lob”注释,该注释将解决PostgreSQL的问题,但是在没有此注释的MySQL中,Hibernate会创建一个类型的“ TinyBlob”字段,在我们的大多数情况下,这对于很小的情况而言。而且,由于我们想在一个以上的环境中使用此项目,因此要切换两个不同的映射很烦人。

是否有任何注释迫使PostgreSQL使用bytea代替@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分配,但是使用此列知道冬眠知道如何存储和检索来自此字段的数据

@Lob
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
private byte[] binaryFile;
有帮助吗?

解决方案

此字段映射定义在 org.hibernate.dialect.PostgreSQLDialect 并且可以通过对此进行亚分和配置以在使用Postgres运行时使用修改后的方言来更改。

子类中的相关咒语可能是

    registerColumnType( Types.BLOB, "bytea" );

打电话给您的构造函数 super().

其他提示

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

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

也工作。比失败的更新...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top