2009-12-22 13 views
9

il problema è il seguente: Usiamo l'ibernazione con annotazioni come O/R Mapper.Hibernate database specifica columnDefinition values ​​

Alcune annotazioni @Column assomigliano:

@Column(columnDefinition = "longblob", name = "binaryData", nullable = true)

o

@Column(columnDefinition = "mediumtext", name = "remark", nullable = true)

con la ColumnDefinition attributi essere mysql specifico

su Postgres per esempio, i valori dovrebbero ColumnDefinition essere "bytea" e "varchar (999999)"

e su oracle probabilmente qualcos'altro.

I problemi si presentano attualmente al momento dell'esportazione dello schema, ad es. quando si creano le istruzioni DDL.

Possibili soluzioni che mi vengono in mente sono - Hack alcuni driver JDBC che fa un testo sostituire (per esempio longblob-> bytea) per le istruzioni DDL. È brutto ma funzionerà in qualche modo - Usa la configurazione hibernate xml invece delle annotazioni. Probabilmente funzionerà, ma preferisco le annotazioni

Qualcuno conosce qualche alternativa? Le soluzioni specifiche per l'ibernazione sono corrette, ad es. se l'attributo ColumnDefinition può contenere valori specifici dialettali come

@Column(columnDefinition = "mysql->mediumtext, postgres->varchar(999999)", name = "remark", nullable = true)

Grazie Holger

+1

Sapete che se trovate una risposta utile, potete votarla. Fare clic sulla freccia SU a sinistra della risposta. :-) – KLE

+0

Fornisce una soluzione specifica per gli UUID, non è carina: https://stackoverflow.com/a/48918942/2102158 –

risposta

9

Perché non si utilizzano le annotazioni di database agnostico come:

  • @Lob (su un byte[] o una proprietà String)
  • @Column(length=90000) (su una proprietà String)

e vedere quali colonne verranno generate nel database. Molto probabilmente saranno dei tipi che vuoi che siano.

+0

Ciao, grazie non ne ero a conoscenza, sembra funzionare. Cordiali saluti Holger – user1946784

+1

E come risolvere questo problema per 'columnDefinition =" json "' dove non riesco a decidere se è json in base al tipo. Postgres capisce la multa JSON, ma in H2 la creazione della colonna fallirà. Voglio ibernare per mappare il nome della colonna in stringa in quel caso. – Tarion

4

Alcune idee:

  • Usa annotazioni in generale, ma li sovraccarico da XML nel caso dove sono specifici per il tuo database. Quindi puoi avere un file di configurazione specifico per il tuo database.
  • Utilizza le costanti java nelle tue annotazioni (devono essere costanti in fase di compilazione, quindi sei limitato). Puoi avere diversi set di costanti Java e puntare verso quello che vuoi esportare. (Attenzione, quando punti verso un'altra costante, devi ricompilare tutto.)
  • Ho anche usato il dialetto per passare del codice nella mia classe di configurazione. La classe di configurazione riceve tutti i dati (da annotazioni o xml) e può quindi postprocedere.

    Ad esempio, ho modificato il simbolo di concatenazione da '||' su Oracle a '+' su SqlServer.
    Questo è convenientemente fatto in fase di esecuzione :-)

+0

Grazie - Ho già le proprietà columnDefinition come costanti per una ricerca più semplice. Non sapevo che le annotazioni possono essere sovraccaricate però - grazie! – user1946784

+0

Grazie, sto terminando la migrazione alle annotazioni @Lob/@Column (lunghezza = 90000) che preferisco modificando il dialetto di ibernazione. Tuttavia, quella sarebbe probabilmente la mia seconda opzione se il primo fallisse. – user1946784

+0

@unknown Certo, più semplice è il migliore :-). – KLE

Problemi correlati