【发布时间】: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