2011-01-01 22 views
12
<property name="hibernate.hbm2ddl.auto">update</property> 

posso creare il mio schema del database, si aggiunge automaticamente le proprietà, vincolo, chiave ecc ... Ma per quanto riguarda aggiornare lo schema del database? Se rimuovo alcune proprietà dalle mie entità, Hibernate non lo rimuove, o se cambio qualche vincolo, la sospensione non tocca il vincolo già creato ...aggiornamento dello schema del database con Hibernate

Quindi, c'è un modo per fare in modo che l'ibernazione si aggiorni davvero lo schema del database?

Grazie.

risposta

6

Abbiamo creato uno strumento per conto nostro che crea le gocce necessarie delle colonne e delle tabelle del database e aggiunge queste gocce all'SQL generato per gli aggiornamenti del database. Ma abbiamo dovuto aggiungere alcuni extra alla generazione SchemaUpdate per farlo funzionare:

  • Abbiamo dovuto aggiungere assegni per le proprietà non nulle. Ciò include l'emissione di un'istruzione UPDATE sui dati per eliminare i valori nulli laddove possibile, portando al successivo punto dei valori predefiniti.
  • Abbiamo dovuto aggiungere controlli per i valori di default delle colonne. I valori predefiniti sono desunti dal nullability di una colonna e il suo tipo di dati. Le primitive sono sempre inizializzate su zero o false, non-null enum al suo primo valore enum, ma per altri oggetti lo script deve essere modificato manualmente.
  • Abbiamo anche aggiunto il supporto per il ridimensionamento delle colonne varchar, perché c'erano casi in cui la lunghezza della colonna del database e la @Column(length) erano diverse.

Ma per mettere tutto insieme, uno strumento completo non può essere creato in questo modo, perché cosa succede se una colonna viene rinominata in codice? Cosa succede se il tipo cambia in un modo non automaticamente convertibile (bool fino ad oggi?). Se non si ha accesso a una cronologia di refactoring, non è sempre possibile propagare le modifiche.

3

No, non c'è. hbm2ddl non è pensato per eseguire una gestione completa delle migrazioni dello schema. È meglio se lo usi solo per modifiche additive allo schema e modifica a mano (gli script generati) per qualcos'altro.

1

Hibernate fornisce una classe chiamata SchemaUpdate che è in grado di sincronizzare una serie di mappature Hibernate con uno schema di database

Old post, ma lasciare che la comunità di sapere se è buono :)

5

Attualmente utilizziamo liquibase a effettuare modifiche automatiche al database in modo agnostico del database. Potrebbe essere possibile estrarre i comandi di liquibase direttamente dalle annotazioni di ibernazione, ma non penso che esista un tale strumento quindi probabilmente dovrai farlo tu stesso.

+0

Cosa intendete dire che il database di liquibase è agnostico? Ho provato a eseguire un changeset di liquibase generato su un RDBMS su un altro RDBMS (ovvero il programma di database) e non ha funzionato. – Fletch

+2

Fletch - L'ho usato per anni ed è db agnostico ma se si esegue l'hardcode del proprio su un db specifico, non lo sarà. Prova ad usare i nodi xml come ... poi tradurrà per te. – csharp4me

2

Alcuni progetti che potrebbero essere utili per gestire le modifiche dello schema:

  • mybatis (1049 domande taggati su SOW)
  • Liquibase (663 domande taggati su SOW)
  • Flyway (400 domande taggati su SOW

Un'altra risorsa che è possibile trovare utile è il feature comparison nel sito Web Flyway (The sono altri progetti correlati menzionati qui).

Problemi correlati