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;
È stato utile?

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...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top