Wie funktioniert die Eigenschaft spring.jpa.hibernate.ddl-auto im Frühjahr genau?

124

Ich habe an meinem Spring-Boot-App-Projekt gearbeitet und festgestellt, dass manchmal ein Verbindungszeitüberschreitungsfehler zu meiner Datenbank auf einem anderen Server (SQL Server) auftritt. Dies geschieht insbesondere, wenn ich versuche, eine Skriptmigration mit FlyWaydurchzuführen, dies funktioniert jedoch nach mehreren Versuchen.

Dann bemerkte ich, dass ich nicht spring.jpa.hibernate.ddl-autoin meiner Eigenschaftendatei angegeben habe. Ich habe einige Nachforschungen angestellt und festgestellt, dass es empfehlenswert ist, diese spring.jpa.hibernate.ddl-auto= create-dropin der Entwicklung hinzuzufügen . Und ändern Sie es in: spring.jpa.hibernate.ddl-auto= nonein Produktion.

Aber ich habe nicht wirklich verstanden, wie es wirklich funktioniert und wie der Ruhezustand das Datenbankschema mit create-dropoder noneWert generiert . Können Sie bitte technisch erklären, wie es wirklich funktioniert und welche Empfehlungen für die Verwendung dieser Eigenschaft in der Entwicklung und auf einem Produktionsserver gelten? Danke dir

METTAIBI
quelle
1
FWIW JPA 2.1 verfügt über eine Standardeigenschaft javax.persistence.schema-generator.database.action. Sie müssen also nicht unbedingt die herstellerspezifischen Eigenschaften von JPA für die Schemaerstellung verwenden.
Neil Stockton
@NeilStockton Eine Idee, die wir mit Hibernate 6 untersuchen, ist die Möglichkeit, die Schemagenerierung basierend auf Kategorien unterschiedlich zu steuern. Beispiel: Ihre Orm-Tabellen sind möglicherweise vorhanden, noneaber Sie möchten möglicherweise, dass Ihre Hibernate Search- und Envers-Tabellen mithilfe generiert werden, updateda sie intern von diesen Projekten verwaltet werden und Sie diese nicht manuell selbst verwalten möchten. Im Moment steuern wir dies global für alle Tabellen, unabhängig von ihrer Herkunft / Quelle. Dies würde den Grund für die Verwendung herstellerspezifischer Optionen fördern, wenn Sie diese verwenden möchten.
Naros

Antworten:

211

Für den Datensatz ist die spring.jpa.hibernate.ddl-autoEigenschaft Spring Data JPA-spezifisch und dient dazu, einen Wert anzugeben, der schließlich unter der ihm bekannten Eigenschaft an Hibernate übergeben wird hibernate.hbm2ddl.auto.

Die Werte create, create-drop, validate, und updateim Grunde beeinflussen , wie das Schema WZV das Datenbankschema beim Start manipulieren.

Die updateOperation fragt beispielsweise die API des JDBC-Treibers ab, um die Datenbankmetadaten abzurufen, und vergleicht dann das erstellte Objektmodell anhand des Lesens Ihrer mit Anmerkungen versehenen Klassen oder HBM-XML-Zuordnungen und versucht, das Schema im laufenden Betrieb anzupassen.

Die updateOperation versucht beispielsweise, neue Spalten, Einschränkungen usw. hinzuzufügen, entfernt jedoch niemals eine Spalte oder Einschränkung, die möglicherweise zuvor vorhanden war, jedoch nicht mehr als Teil des Objektmodells aus einem vorherigen Lauf.

In der Regel werden Sie in Testfallszenarien wahrscheinlich verwenden create-drop, um Ihr Schema zu erstellen, Ihr Testfall fügt einige Scheindaten hinzu, Sie führen Ihre Tests aus und während der Testfallbereinigung werden die Schemaobjekte gelöscht, sodass eine leere Datenbank verbleibt.

In der Entwicklung ist es häufig üblich, dass Entwickler updatedas Schema automatisch ändern, um beim Neustart neue Ergänzungen hinzuzufügen. Aber verstehen Sie noch einmal, dies entfernt keine Spalte oder Einschränkung, die möglicherweise aus früheren Ausführungen vorhanden ist und nicht mehr erforderlich ist.

In der Produktion wird häufig empfohlen none, diese Eigenschaft zu verwenden oder einfach nicht anzugeben. Dies liegt daran, dass DBAs häufig Migrationsskripts auf Datenbankänderungen überprüfen, insbesondere wenn Ihre Datenbank für mehrere Dienste und Anwendungen freigegeben ist.

Naros
quelle
11
Ja, verwenden Sie niemals die ddl-Generierung in der Produktion. Wir generieren die ersten Skripte für die Tabellenstruktur mit ddl und beziehen den DBA in den Prozess ein. Anschließend fügen wir die DB-Skripte als Teil der Bereitstellungseinheit hinzu und führen sie mit Flyway aus, wenn die Anwendung bereitgestellt wird. Wenn wir die Datenbank ändern müssen, fügen wir der nächsten Version der Anwendung neue Skripts hinzu und stellen sie für das Staging bereit. Flyway erkennt automatisch die aktuelle Version und führt die Skripte aus, die erforderlich sind, um die Datenbank auf die neueste Version zu bringen. Wenn alles funktioniert, stellen wir es für die Produktion bereit.
Klaus Groenbaek
1
Was ist, wenn wir diese Eigenschaft nicht angeben? Zum Beispiel habe ich mein eigenes <bean id = "sessionFactory" class = "org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... <prop key = "hibernate.hbm2ddl.auto"> Update </ prop> Ich hatte dieses und aus irgendeinem Grund wurden meine Tabellen immer gelöscht, bis ich die oben erwähnte Eigenschaft hinzufügte ;; ps: Entschuldigung für Codebeispiel)
Iîgan Ion
11
Warum nicht validatein Production Env?
Shamal Karunarathne
20
@ShamalKarunarathne-Anwendungen können validatein der Produktion verwendet werden. Dies sollte jedoch normalerweise eine Einstellung sein, die Sie in Ihrer Qualitäts- / Testumgebung verwenden, um zu überprüfen, ob die Datenbankskripte, die Sie geschrieben oder auf Ihr Datenbankmigrationstool angewendet haben, korrekt sind. Ein weiterer Grund, warum Sie es nicht validatein der Produktion verwenden sollten, besteht darin, dass es während des Startvorgangs Ihrer Anwendung zu einem Engpass kommen kann, insbesondere wenn Ihr Objektmodell sehr umfangreich ist oder wenn andere netzwerkbezogene Faktoren ins Spiel kommen.
Naros
1
Ohne eine genaue Stapelspur ist es schwer zu spekulieren; Meine erste Vermutung wäre jedoch, dass orderder SQL-Parser ihn falsch interpretiert, da dies ein Schlüsselwort ist, wenn es nicht maskiert wird.
Naros