2010-12-20 46 views
9

当在不同数据库之间切换时,我有一个关于包含大对象(BLOB)的hibernate映射的奇怪问题。Hibernate,Postgresql:列“x”的类型是oid,但是表达式的类型是字节

@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 

的解决方案和同为一个getter,如果存在一种方法做种这

编辑:

以下声明正在工作。它分配列OID,但是使用这种知道如何存储和

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

回答

9

此字段映射在org.hibernate.dialect.PostgreSQLDialect定义,可以通过继承这个和配置您的应用程序使用来改变这样的字段检索数据冬眠用postgres运行时修改了方言。

子类中相关的咒语可能是把

registerColumnType(Types.BLOB, "bytea"); 

在构造函数来super()通话后。

+1

唐嗨!谢谢您的回答。我试了一下,并且它工作正常,但是我发现了一个简单的解决方案,我在问题中添加了这个问题 – Hons 2010-12-23 07:20:48

0

对于我来说,这可能意味着一次“恢复你的Postgres JDBC版本回落到9.3-1101.jdbc4”

相关问题