在不同数据库之间进行切换时,关于包含大对象(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;
此字段映射是在其中定义的org.hibernate.dialect.PostgreSQLDialect,可以通过将其子类化并配置您的应用程序以在与postgres一起运行时使用修改后的方言来更改。
org.hibernate.dialect.PostgreSQLDialect
子类中的相关咒语可能是
registerColumnType( Types.BLOB, "bytea" );
在构造函数中调用super()。
super()