Ich möchte wirklich mehr über das Update, den Export und die Werte wissen, die gegeben werden könnten hibernate.hbm2ddl.auto
erfahren mir Ich muss wissen, wann ich das Update verwenden soll und wann nicht. Und was ist die Alternative?
Dies sind Änderungen, die über DB auftreten können:
- neue Tabellen
- neue Spalten in alten Tabellen
- Spalten gelöscht
- Datentyp einer Spalte geändert
- Ein Spaltentyp hat seine Attribute geändert
- Tische fallen gelassen
- Werte einer Spalte geändert
Was ist in jedem Fall die beste Lösung?
Es gibt auch den undokumentierten Wert "none", um es vollständig zu deaktivieren.
quelle
Die Konfigurationseigenschaft wird aufgerufen
hibernate.hbm2ddl.auto
In unserer Entwicklungsumgebung legen
hibernate.hbm2ddl.auto=create-drop
wir fest, dass bei jeder Bereitstellung eine saubere Datenbank gelöscht und erstellt wird, damit sich unsere Datenbank in einem bekannten Zustand befindet.Theoretisch können Sie einstellen
hibernate.hbm2ddl.auto=update
, dass Ihre Datenbank mit Änderungen an Ihrem Modell aktualisiert wird, aber ich würde dem in einer Produktionsdatenbank nicht vertrauen. Eine frühere Version der Dokumentation besagte, dass dies zumindest experimentell war; Ich kenne den aktuellen Status nicht.Legen Sie daher für unsere Produktionsdatenbank nicht fest
hibernate.hbm2ddl.auto
- standardmäßig werden keine Datenbankänderungen vorgenommen. Stattdessen erstellen wir manuell ein SQL DDL-Aktualisierungsskript, das Änderungen von einer Version zur nächsten anwendet.quelle
Ich würde Liquibase für die Aktualisierung Ihrer Datenbank verwenden . Die Schema-Update-Funktion von hibernate ist für Entwickler nur dann in Ordnung, wenn sie neue Funktionen entwickeln. In einer Produktionssituation muss das Datenbank-Upgrade sorgfältiger behandelt werden.
quelle
Es ist zwar ein ziemlich alter Beitrag, aber als ich einige Nachforschungen zu diesem Thema anstellte, dachte ich daran, ihn zu teilen.
hibernate.hbm2ddl.auto
Gemäß der Dokumentation kann es vier gültige Werte haben:
erstellen | Update | validieren | create-drop
Es folgt die Erklärung des Verhaltens, das durch diesen Wert angezeigt wird:
Im Folgenden sind die wichtigsten Punkte aufgeführt, die es zu beachten gilt:
Table not found:<table name>
Für den Fall, dass ich dieser Eigenschaft einen Wert gebe (sagen wir abc anstelle der oben diskutierten vier Werte) oder sie einfach leer gelassen wird. Es zeigt folgendes Verhalten:
-Wenn das Schema nicht in der Datenbank vorhanden ist: - Es erstellt das Schema
-Wenn ein Schema in der Datenbank vorhanden ist: - Aktualisieren Sie das Schema.
quelle
Erstens sind die möglichen Werte für die
hbm2ddl
Konfigurationseigenschaft die folgenden:none
- Es wird keine Aktion ausgeführt. Das Schema wird nicht generiert.create-only
- Das Datenbankschema wird generiert.drop
- Das Datenbankschema wird gelöscht und anschließend erstellt.create
- Das Datenbankschema wird gelöscht und anschließend erstellt.create-drop
- Das Datenbankschema wird gelöscht und anschließend erstellt. Beim Schließen vonSessionFactory
wird das Datenbankschema gelöscht.validate
- Das Datenbankschema wird anhand der Entitätszuordnungen überprüft.update
- Das Datenbankschema wird aktualisiert, indem das vorhandene Datenbankschema mit den Entitätszuordnungen verglichen wird.Ich habe einen Blog-Beitrag gewidmet für die gängigsten Strategien zur Generierung von Hibernate-DDLs erstellt :
hibernate.hbm2ddl.auto="update"
ist praktisch, aber weniger flexibel, wenn Sie Funktionen hinzufügen oder einige benutzerdefinierte Skripts ausführen möchten.Selbst wenn Sie Flyway verwenden, können Sie das erste Migrationsskript mit hbm2ddl generieren. In diesem Artikel erfahren Sie, wie Sie das JPA-Entitätsmodell mit dem jOOQ-Tabellenmodell kombinieren können.
quelle
hibernate.hbm2ddl.auto
Überprüft DDL automatisch und exportiert es in das Schema, wenn die sessionFactory erstellt wird.Standardmäßig führt es keine automatische Erstellung oder Änderung der Datenbank durch. Wenn der Benutzer einen der folgenden Werte festlegt, werden DDL-Schemaänderungen automatisch durchgeführt.
create - Erstellen eines Schemas
update - Aktualisierung des vorhandenen Schemas
validieren - Validiert das vorhandene Schema
create-drop - Erstellt und löscht das Schema automatisch, wenn eine Sitzung gestartet und beendet wird
quelle
Wenn Sie Strings nicht in Ihrer App verwenden möchten und nach vordefinierten Konstanten suchen
org.hibernate.cfg.AvailableSettings
, sehen Sie sich die in der JAR für den Ruhezustand enthaltene Klasse an, in der Sie eine Konstante für alle möglichen Einstellungen finden. In Ihrem Fall zum Beispiel:quelle
validate
: Überprüft das Schema. Die Datenbank wird nicht geändert.update
: Aktualisiert das Schema mit der aktuellen Ausführungsabfrage.create
: Erstellt jedes Mal ein neues Schema und zerstört vorherige Daten.create-drop
: Löscht das Schema, wenn die Anwendung gestoppt oder SessionFactory explizit geschlossen wird.quelle
Ich denke, Sie sollten sich auf das konzentrieren müssen
Diese Klasse macht Ihre Konfiguration dynamisch. So können Sie auswählen, welche Suiten für Sie am besten geeignet sind ...
Kasse [SchemaExport]
quelle
validate
: Es überprüft das Schema und nimmt keine Änderungen an der Datenbank vor.Angenommen, Sie haben der Zuordnungsdatei eine neue Spalte hinzugefügt und den Einfügevorgang ausgeführt. Es wird eine Ausnahme ausgelöst, bei der die XYZ-Spalte fehlt, da sich das vorhandene Schema von dem Objekt unterscheidet, das Sie einfügen möchten. Wenn Sie die Tabelle ändern, indem Sie diese neue Spalte manuell hinzufügen und dann den Einfügevorgang ausführen, werden definitiv alle Spalten zusammen mit der neuen Spalte in die Tabelle eingefügt. Bedeutet, dass keine Änderungen / Änderungen am vorhandenen Schema / der vorhandenen Tabelle vorgenommen werden.
update
: Es ändert die vorhandene Tabelle in der Datenbank, wenn Sie eine Operation ausführen. Mit dieser Option von hbm2ddl können Sie Spalten hinzufügen oder entfernen. Wenn Sie jedoch eine neue Spalte hinzufügen, die 'NOT NULL' ist, wird das Hinzufügen dieser bestimmten Spalte zur Datenbank ignoriert. Weil die Tabelle leer sein muss, wenn Sie der vorhandenen Tabelle eine Spalte 'NOT NULL' hinzufügen möchten.quelle
Seit 5.0 finden Sie diese Werte jetzt in einem dedizierten
Enum
:org.hibernate.boot.SchemaAutoTooling
(erweitert mit WertNONE
seit 5.2).Oder noch besser, seit 5.1 können Sie auch die JPA 2- und "Legacy" -Hibernate-DDL-Aktionen verwenden.
org.hibernate.tool.schema.Action
Enum
Aber Sie können nicht noch konfigurieren
DataSource
programmatisch mit diesem. Es wäre schöner, dies in Kombination mit zu verwenden,org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO
aber der aktuelle Code erwartet einenString
Wert (Auszug ausSessionFactoryBuilderImpl
):… Und interne
enum
Werte von beidenorg.hibernate.boot.SchemaAutoTooling
undorg.hibernate.tool.schema.Action
werden nicht öffentlich bekannt gemacht.Im Folgenden eine beispielhafte programmatische
DataSource
Konfiguration (die in einer meiner Spring Boot-Anwendungen verwendet wird), die dank ein Gambit verwendet,.name().toLowerCase()
aber nur mit Werten ohne Bindestrich funktioniert (nichtcreate-drop
zum Beispiel):quelle
An wen sucht nach Standardwert ...
Es ist im Quellcode in Version 2.0.5 von Spring-Boot und 1.1.0 in JpaProperties geschrieben:
quelle