Come funziona esattamente la proprietà spring.jpa.hibernate.ddl-auto in primavera?


128

Stavo lavorando al progetto dell'app Spring Boot e ho notato che a volte si verifica un errore di timeout della connessione al mio database su un altro server (SQL Server). Ciò accade specialmente quando provo a eseguire la migrazione degli script con, FlyWayma funziona dopo diversi tentativi.

Poi ho notato che non ho specificato spring.jpa.hibernate.ddl-autonel mio file delle proprietà. Ho fatto alcune ricerche e ho scoperto che si consiglia di aggiungere spring.jpa.hibernate.ddl-auto= create-dropin fase di sviluppo. E cambiarlo in: spring.jpa.hibernate.ddl-auto= nonein produzione.

Ma in realtà non ho capito come funziona davvero e come l'ibernazione genera lo schema del database usando create-dropo nonevalore. Puoi spiegare tecnicamente come funziona davvero e quali sono i consigli per l'utilizzo di questa proprietà in fase di sviluppo e su un server di produzione. Grazie


1
FWIW JPA 2.1 ha una proprietà standard javax.persistence.schema-generation.database.action, quindi non vedo davvero la necessità di utilizzare proprietà specifiche del fornitore JPA per la generazione di schemi.
Neil Stockton

@NeilStockton Un'idea che stiamo esplorando con Hibernate 6 è la capacità di essere in grado di controllare la generazione di schemi in modo diverso in base alle categorie; ad esempio, le tue tabelle orm potrebbero esserlo, nonema potresti volere che le tue tabelle Hibernate Search ed Envers vengano generate utilizzando updatepoiché sono gestite internamente da quei progetti e non vuoi gestirle manualmente. In questo momento lo controlliamo globalmente per tutte le tabelle indipendentemente dalla loro origine / origine. Questo sarebbe ulteriormente il motivo per utilizzare opzioni specifiche del fornitore se si desidera utilizzare questo.
Naros

Risposte:


214

Per la cronaca, la spring.jpa.hibernate.ddl-autoproprietà è primavera dati JPA specifico ed è il loro modo di specificare un valore che alla fine essere passato a Hibernate sotto la proprietà sa, hibernate.hbm2ddl.auto.

I valori create, create-drop, validate, e updatefondamentalmente influenzano il modo della gestione utensili schema sarà manipolare lo schema del database in fase di avvio.

Ad esempio, l' updateoperazione interrogherà l'API del driver JDBC per ottenere i metadati del database, quindi Hibernate confronterà il modello a oggetti che crea in base alla lettura delle classi annotate o delle mappature XML HBM e tenterà di regolare lo schema al volo.

L' updateoperazione, ad esempio, tenterà di aggiungere nuove colonne, vincoli, ecc. Ma non rimuoverà mai una colonna o un vincolo che potrebbe essere esistito in precedenza ma che non fa più come parte del modello a oggetti da un'esecuzione precedente.

In genere negli scenari di casi di test, è probabile create-dropche si utilizzi in modo da creare lo schema, il caso di test aggiunge alcuni dati fittizi, si eseguono i test e quindi durante la pulizia del caso di test, gli oggetti dello schema vengono eliminati, lasciando un database vuoto.

In fase di sviluppo, è spesso comune vedere gli sviluppatori utilizzare updateper modificare automaticamente lo schema per aggiungere nuove aggiunte al riavvio. Ma ancora una volta capisci, questo non rimuove una colonna o un vincolo che potrebbe esistere da esecuzioni precedenti che non è più necessario.

Nella produzione, è spesso altamente consigliato utilizzare noneo semplicemente non specificare questa proprietà. Questo perché è pratica comune per gli amministratori di database rivedere gli script di migrazione per le modifiche al database, in particolare se il database è condiviso tra più servizi e applicazioni.


11
Sì, non usare mai la generazione ddl in produzione. Generiamo gli script iniziali per la struttura della tabella utilizzando ddl e coinvolgiamo il DBA nel processo. Quindi includiamo gli script db come parte dell'unità di distribuzione e li eseguiamo utilizzando Flyway quando l'applicazione viene distribuita. Quando è necessario modificare il database, aggiungiamo nuovi script alla versione successiva dell'applicazione e distribuiamo allo staging. Flyway rileverà automaticamente la versione corrente ed eseguirà gli script necessari per portare il database alla versione più recente. Se tutto funziona, implementiamo la produzione.
Klaus Groenbaek

1
cosa succede se non specifichiamo questa proprietà? ad esempio ho il mio <bean id = "sessionFactory" class = "org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... <prop key = "hibernate.hbm2ddl.auto"> aggiornamento </prop> Ho avuto questo e per qualche motivo le mie tabelle venivano sempre eliminate, finché non ho aggiunto la proprietà sopra menzionata ;; ps: scusa per il codice di esempio)
Ţîgan Ion

11
Perché non validatein Production Env?
Shamal Karunarathne

20
Le applicazioni @ShamalKarunarathne possono essere utilizzate validatein produzione, ma in genere dovrebbe essere un'impostazione che utilizzi nel tuo ambiente di qualità / test per verificare che gli script di database scritti o applicati allo strumento di migrazione del database siano accurati. Un altro motivo per non utilizzarlo validatein produzione è che potrebbe essere un collo di bottiglia durante il processo di avvio dell'applicazione, in particolare se il modello a oggetti ha dimensioni piuttosto estese o se entrano in gioco altri fattori relativi alla rete.
Naros

1
Senza una traccia precisa dello stack è difficile speculare; tuttavia, la mia prima ipotesi sarebbe che ordervenga interpretato in modo errato dal parser SQL poiché questa è una parola chiave se non viene eseguita l'escape.
Naros
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.