Hibernate, PostgreSQL: Colonna “x” è di tipo OID ma l'espressione è di tipo byte
-
11-10-2019 - |
Domanda
Ho un problema strano per quanto riguarda la mappatura di ibernazione che contiene oggetti di grandi dimensioni (BLOB), quando si passa da database diversi.
@Lob
private byte[] binaryData;
Il campo precedente crea un campo matrice di byte in MySQL e Oracle, tuttavia in PostreSQL crea un campo di tipo oid.
Ora, quando provo ad accedere a questo settore funziona bene nelle altre banche dati, ma in PostgreSQL viene a mancare con il seguente errore
Column "binaryData" is of type oid but expression is of type bytea.
Così ho cercato di rimuovere semplicemente l'annotazione "@Lob", che risolverà il problema per PostgreSQL, ma in MySQL, senza questa annotazione, hibernate crea un campo di tipo "TINYBLOB", che è di piccole dimensioni, nella maggior parte dei nostri casi . E, come vogliamo usare questo progetto in più di un ambiente che è fastidioso avere due mappature diverse per switch.
C'è qualche annotazione che le forze postgreSQL utilizzare bytea invece di OID per i campi annotati con @Lob? O è in qualche modo possibile omettere il @Lob e mettere qualcosa d'altro al fine di costringere MySQL per allocare con un tipo di dati più grande come sarebbe usando @Lob?
ho potuto nemmeno immaginare di avere una soluzione di questo tipo
if (field is of type oid)
store it as oid
else if (field is of type bytea)
store it as bytea
else
// not storable
e la stessa di un getter, se esiste un modo per fare questo tipo di
Modifica
La seguente dichiarazione è in funzione. Si assegna la colonna come OID, tuttavia ibernazione utilizzando questo sa come memorizzare e recuperare i dati da un tale campo
@Lob
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
private byte[] binaryFile;
Soluzione
This field mapping is defined in org.hibernate.dialect.PostgreSQLDialect
and can be changed by subclassing this and configuring your app to use the modified dialect when running with postgres.
The relevant incantation in the subclass is probably to put
registerColumnType( Types.BLOB, "bytea" );
in your constructor after a call to super()
.
Altri suggerimenti
For me this may have meant once "revert your postgres jdbc version back down to 9.3-1101.jdbc4"
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1200-jdbc41</version>
</dependency>
worked as well. Newer than that failed...