Hibernate,PostgreSQL:“ X”列是OID类型,但表达式为字节
-
11-10-2019 - |
题
在不同数据库之间切换时,我在包含大物体(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>
也工作。比失败的更新...
不隶属于 StackOverflow