Was sind die möglichen Werte der Konfiguration von Hbn2ddl.auto im Ruhezustand und was tun sie?

1085

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?

Vlad Mihalcea
quelle

Antworten:

1083

Aus der Community-Dokumentation :

hibernate.hbm2ddl.auto Überprüft oder exportiert Schema-DDL automatisch in die Datenbank, wenn die SessionFactory erstellt wird. Mit create-drop wird das Datenbankschema gelöscht, wenn die SessionFactory explizit geschlossen wird.

zB validieren | Update | erstellen | create-drop

Die Liste der möglichen Optionen lautet also:

  • validieren : Validiert das Schema, nimmt keine Änderungen an der Datenbank vor.
  • Update : Aktualisieren Sie das Schema.
  • create : Erstellt das Schema und zerstört vorherige Daten.
  • create-drop : Löscht das Schema, wenn die SessionFactory explizit geschlossen wird, normalerweise wenn die Anwendung gestoppt wird.
  • none : macht nichts mit dem Schema, nimmt keine Änderungen an der Datenbank vor

Diese Optionen scheinen Entwickler-Tools zu sein und keine Datenbanken auf Produktionsebene zu vereinfachen. Vielleicht möchten Sie sich die folgende Frage ansehen. Ruhezustand: hbm2ddl.auto = Update in Produktion?

James McMahon
quelle
14
Lesen Sie einfach das Dokument zum Ruhezustand ... für gültige Werte heißt es: "zB" ... gibt es noch andere gültige Werte?
Ta Sas
16
Ich denke, es heißt "zB", weil es nur eine Community-Dokumentation ist. Wenn jemand an allen möglichen Werten interessiert ist, kann sie in Hibernates Javadoc gefunden werden. (Und ja, nur diese vier Optionen sind vorhanden) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/…
szegedi
4
validieren sagt validieren das Schema, was genau bedeutet es?
Hussain Akhtar Wahid 'Ghouri'
6
Sie können auch "Erdferkel", "Taube" oder ein anderes Wort verwenden, wenn der Ruhezustand nichts bewirken soll. Nicht, dass ich das natürlich empfehlen würde!
Ward
2
Eine kleine Ergänzung zur Create-Drop-Option. Wenn diese Option verwendet wird, wird nicht das gesamte Schema gelöscht, sondern die Tabellen, deren Zuordnungen während der Ausführung verfügbar sind. Wenn eine Datenbank mit Schema S beispielsweise A-, B-, C-Tabellen enthält und Java-Code nur Zuordnungen für A und B enthält, löscht Hibernate die Tabelle C nicht.
Aditya
194

Es gibt auch den undokumentierten Wert "none", um es vollständig zu deaktivieren.

Michiel Verkaik
quelle
7
Dies ist tatsächlich sehr nützlich, da die Schemaüberprüfung von Hibernate für perfekt gültige Schemas manchmal fehlschlägt.
Michael Piefel
Ich wollte gerade nach so etwas fragen. Meine Absicht ist es, die Startzeit zu reduzieren.
digao_mb
46
'leere Zeichenfolge' ist besser als 'keine' . Um 'none' zu verwenden, erhalten Sie eine Warnmeldung: org.hibernate.cfg.SettingsFactory - Nicht erkannter Wert für "
hibernate.hbm2ddl.auto
14
Ich habe es gepatcht. "Keine" als explizit gültige Konstante hinzugefügt.
Sanne
9
Ich mag " hibernate.hbm2ddl.auto
Sneg
161

Die Konfigurationseigenschaft wird aufgerufen hibernate.hbm2ddl.auto

In unserer Entwicklungsumgebung legen hibernate.hbm2ddl.auto=create-dropwir 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.

Peter Hilton
quelle
5
Gemäß der Dokumentation erstellt create-drop die Datenbanktabellen und löscht sie, wenn die Sitzungsfactory explizit geschlossen wird. Es ist nicht die Tabellen fallen , wenn die Sitzung Fabrik erstellt wird.
Frans
4
Nein, sowohl create-drop als auch create drop die Tabellen, wenn die Sessionfactory erstellt wird, und create-drop löscht die Tabellen auch, wenn die Sessionfactory geschlossen ist. Siehe stackoverflow.com/a/6752698/1536382
Testo Testini
Kann das Erstellen von hibernate.hbm2ddl.auto = create-drop in der Produktion zu mehreren Verbindungszeitüberschreitungen in der Produktion führen?
METTAIBI
51

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.

Klopfen
quelle
6
Unter stackoverflow.com/questions/221379/… erfahren Sie, warum Sie hbm2ddl nicht für die Produktion verwenden sollten.
Nathan Voxland
51

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:

  • create : - Erstelle das Schema, die zuvor im Schema vorhandenen Daten (falls vorhanden) gehen verloren
  • update: - Aktualisiere das Schema mit den angegebenen Werten.
  • validieren: - validieren Sie das Schema. Es ändert sich nichts in der Datenbank.
  • create-drop: - Erstellen Sie das Schema, indem Sie die zuvor vorhandenen Daten zerstören (falls vorhanden). Das Datenbankschema wird auch gelöscht, wenn die SessionFactory geschlossen wird.

Im Folgenden sind die wichtigsten Punkte aufgeführt, die es zu beachten gilt:

  • Wenn im Falle einer Aktualisierung kein Schema in der Datenbank vorhanden ist, wird das Schema erstellt.
  • Im Falle einer Validierung wird das Schema nicht erstellt, wenn es in der Datenbank nicht vorhanden ist. Stattdessen wird ein Fehler ausgegeben: -Table not found:<table name>
  • Im Fall von create-drop wird das Schema beim Schließen der Sitzung nicht gelöscht. Es wird nur beim Schließen der SessionFactory gelöscht.
  • 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.

amit
quelle
Es ist in der Tat ein sehr wichtiger Punkt, dass ein Schema erstellt wird, wenn es nicht existiert, wenn "Update" verwendet wird.
Yuranos
create-drop wird beim Vergleich der Anweisungen "Erklärung des Verhaltens" und "Wichtige Punkte" widersprochen.
VNT
2
Was ist der Unterschied zwischen Update und Leer ?
Yashjain12yj
46

Erstens sind die möglichen Werte für die hbm2ddlKonfigurationseigenschaft 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 von SessionFactorywird 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 :

  1. Dies hibernate.hbm2ddl.auto="update"ist praktisch, aber weniger flexibel, wenn Sie Funktionen hinzufügen oder einige benutzerdefinierte Skripts ausführen möchten.
  2. Der flexibelste Ansatz ist die Verwendung Flyway .

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.

Vlad Mihalcea
quelle
27

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

    <entry key="hibernate.hbm2ddl.auto" value="create">
  • update - Aktualisierung des vorhandenen Schemas

    <entry key="hibernate.hbm2ddl.auto" value="update">
  • validieren - Validiert das vorhandene Schema

    <entry key="hibernate.hbm2ddl.auto" value="validate">
  • create-drop - Erstellt und löscht das Schema automatisch, wenn eine Sitzung gestartet und beendet wird

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">
Vinod Kumawat
quelle
2
Was ist mit <entry key = "hibernate.hbm2ddl.auto" value = "none">?
VNT
17

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:

/**
 * Auto export/update schema using hbm2ddl tool. Valid values are <tt>update</tt>,
 * <tt>create</tt>, <tt>create-drop</tt> and <tt>validate</tt>.
 */
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
Stefan Haberl
quelle
5
Warum wird auf eine mehr als 700 Zeilen lange Quelldatei über der geraden Antwort mit fast 500 Vole-Ups verwiesen?
Pavel Niedoba
... diese Frage macht keinen Sinn. Warum gibt es Dinge? Warum bin ich überhaupt hier?
Spezialisiert
8
  • 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.
Vishal Thakur
quelle
Was ist die "offizielle" Dokumentationsreferenz? - Ich frage mich nur ...
Dirk Schumacher
7

Ich denke, Sie sollten sich auf das konzentrieren müssen

SchemaExport Class 

Diese Klasse macht Ihre Konfiguration dynamisch. So können Sie auswählen, welche Suiten für Sie am besten geeignet sind ...

Kasse [SchemaExport]

Vishal Sharma
quelle
4

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.

Arun Raaj
quelle
3

Seit 5.0 finden Sie diese Werte jetzt in einem dedizierten Enum: org.hibernate.boot.SchemaAutoTooling(erweitert mit Wert NONEseit 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 DataSourceprogrammatisch mit diesem. Es wäre schöner, dies in Kombination mit zu verwenden, org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTOaber der aktuelle Code erwartet einen StringWert (Auszug aus SessionFactoryBuilderImpl):

this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );

… Und interne enumWerte von beiden org.hibernate.boot.SchemaAutoToolingund org.hibernate.tool.schema.Actionwerden nicht öffentlich bekannt gemacht.

Im Folgenden eine beispielhafte programmatische DataSourceKonfiguration (die in einer meiner Spring Boot-Anwendungen verwendet wird), die dank ein Gambit verwendet, .name().toLowerCase()aber nur mit Werten ohne Bindestrich funktioniert (nicht create-dropzum Beispiel):

@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {

    Map<String, Object> properties = new HashMap<>();
    properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.CREATE.name().toLowerCase());
    properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());

    return builder
            .dataSource(internalDataSource)
            .packages(JpaModelsScanEntry.class, Jsr310JpaConverters.class)
            .persistenceUnit(PERSISTENCE_UNIT_NAME)
            .properties(properties)
            .build();
}
Doc Davluz
quelle
0

An wen sucht nach Standardwert ...

Es ist im Quellcode in Version 2.0.5 von Spring-Boot und 1.1.0 in JpaProperties geschrieben:

    /**
     * DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
     * property. Defaults to "create-drop" when using an embedded database and no
     * schema manager was detected. Otherwise, defaults to "none".
     */
    private String ddlAuto;
ibrahim demir
quelle