2010-12-20 71 views
9

Tengo un problema extraño con respecto a la asignación de hibernación que contiene objetos grandes (BLOB), al cambiar entre diferentes bases de datos.Hibernate, Postgresql: La columna "x" es de tipo oid pero la expresión es de tipo byte

@Lob 
private byte[] binaryData; 

El campo de arriba crea un campo de matriz de bytes en MySQL y Oracle, sin embargo, en PostreSQL crea un campo de tipo OID.

Ahora, cuando intento acceder a este campo que trabaja muy bien en las otras bases de datos, pero en PostgreSQL se produce un error con el siguiente error

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

así que traté de simplemente eliminar la anotación "@Lob", el cual resolverá el problema para PostgreSQL, sin embargo en MySQL sin esta anotación, hibernate crea un campo de tipo "tinyblob", que es pequeño en la mayoría de nuestros casos. Y, como queremos utilizar este proyecto en más de un entorno, es molesto tener dos asignaciones diferentes para cambiar.

¿Hay alguna anotación que obligue a postgreSQL a usar bytea en lugar de oid para los campos anotados con @Lob? ¿O es de alguna manera posible omitir el @Lob y poner algo más para obligar a MySQL a asignarlo con un tipo de datos más grande como lo haría con @Lob?

Incluso podía imaginar tener una solución como esta

if (field is of type oid) 
    store it as oid 
else if (field is of type bytea) 
    store it as bytea 
else 
    // not storable 

y lo mismo que un comprador, si existe una manera de hacer la clase de este

EDIT:

La siguiente declaración está funcionando. Se asigna la columna como OID, sin embargo hibernación usar este sabe cómo almacenar y recuperar datos de un campo tan

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

Respuesta

9

Esta asignación de campos se define en org.hibernate.dialect.PostgreSQLDialect y se puede cambiar por la subclasificación de esto y la configuración de su aplicación para utilizar el dialecto modificado cuando se ejecuta con postgres.

El encantamiento relevante en la subclase es probablemente para poner

registerColumnType(Types.BLOB, "bytea"); 

en su constructor después de una llamada a super().

+1

Hola Don! Gracias por su respuesta. Lo probé, y funciona bien, sin embargo encontré entretanto una solución simple que agregué a la pregunta – Hons

0

Para mí esto puede haber significado una vez "revertir su postgres versión JDBC de vuelta a 9.3-1101.jdbc4"

Cuestiones relacionadas