Pregunta

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.

@Lob
private byte[] binaryData;

El campo anterior crea un campo de matriz de bytes en MySQL y en Oracle, sin embargo, en PostreSQL que 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", que va a resolver el problema para PostgreSQL, sin embargo, en MySQL sin esta anotación, hibernación crea un campo de tipo "TINYBLOB", que es pequeño en la mayoría de nuestros casos . Y, ya que queremos utilizar este proyecto en más de un medio ambiente que es molesto tener dos aplicaciones diferentes al interruptor.

¿Hay alguna anotación en la que las fuerzas de PostgreSQL para utilizar bytea en lugar de OID para campos con anotada @Lob? O se trata de alguna manera posible omitir el @Lob y poner algo más con el fin de forzar a MySQL asignarlo a un tipo de datos más grande, ya que sería el uso de @Lob?

Incluso podrí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 este tipo de

EDIT:

La siguiente declaración está trabajando. 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;
¿Fue útil?

Solución

Esta asignación de campos se define en org.hibernate.dialect.PostgreSQLDialect y se puede cambiar esta subclase y configurar 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().

Otros consejos

Para mí esto puede significar una "versión revertir sus postgres JDBC de vuelta a 9.3-1101.jdbc4"

  <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.4-1200-jdbc41</version>
  </dependency>

funcionaba tan bien. Más reciente que no ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top