wake-up-neo.com

Welche Werte sind in der Konfiguration von Hibernate hbm2ddl.auto möglich und was tun sie?

Ich möchte wirklich mehr über das Update, den Export und die Werte wissen, die hibernate.hbm2ddl.auto zugewiesen werden könnten.
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 Tische
  • 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

In jedem Fall was ist die beste Lösung?

1018
Suzan

Aus der Community-Dokumentation :

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

z.B. validieren | aktualisieren | erstellen | create-drop

So ist die Liste der möglichen Optionen,

  • validate : 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.

Bei diesen Optionen handelt es sich anscheinend um Entwicklertools, die keine Datenbanken auf Produktionsebene vereinfachen. Vielleicht möchten Sie sich die folgende Frage ansehen. Ruhezustand: hbm2ddl.auto = Update in der Produktion?

1018
James McMahon

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

189
Michiel Verkaik

Die Konfigurationseigenschaft heißt hibernate.hbm2ddl.auto

In unserer Entwicklungsumgebung haben wir hibernate.hbm2ddl.auto=create-drop so eingestellt, dass bei jeder Bereitstellung eine saubere Datenbank gelöscht und erstellt wird, sodass sich unsere Datenbank in einem bekannten Zustand befindet.

Theoretisch können Sie hibernate.hbm2ddl.auto=update festlegen, um Ihre Datenbank mit Änderungen an Ihrem Modell zu aktualisieren, aber ich würde dem bei einer Produktionsdatenbank nicht vertrauen. Eine frühere Version der Dokumentation besagte, dass dies zumindest experimentell war; Ich kenne den aktuellen Status nicht.

Setzen Sie daher für unsere Produktionsdatenbank nicht 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.

153
Peter Hilton

Ich würde liquibase verwenden, um Ihre Datenbank zu aktualisieren. Die Schema-Update-Funktion von Hibernate ist wirklich nur in Großbritannien verfügbar. für einen Entwickler, während er neue Funktionen entwickelt. In einer Produktionssituation muss das Datenbank-Upgrade sorgfältiger gehandhabt werden.

51
Pat

Es ist zwar ein ziemlich alter Beitrag, aber als ich einige Nachforschungen zu diesem Thema anstellte, dachte ich darüber nach, ihn zu teilen.

hibernate.hbm2ddl.auto

Gemäß der Dokumentation kann es vier gültige Werte haben:

create | update | validate | create-drop

Das Folgende ist die Erklärung des Verhaltens, das durch diesen Wert angezeigt wird:

  • create : - Beim Erstellen des Schemas gehen die zuvor im Schema vorhandenen Daten (falls vorhanden) verloren
  • update: - Aktualisieren Sie das Schema mit den angegebenen Werten.
  • validieren: - das Schema validieren. Es werden keine Änderungen in der DB vorgenommen.
  • create-drop: - Erstellt das Schema, indem die zuvor vorhandenen Daten gelöscht werden (falls vorhanden). Außerdem wird das Datenbankschema gelöscht, wenn die SessionFactory geschlossen wird.

Im Folgenden sind die wichtigen Punkte zu beachten:

  • Im Fall von update wird das Schema erstellt, wenn es in der Datenbank nicht vorhanden ist.
  • Im Fall von validate 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 das Schema in der Datenbank vorhanden ist: - update das Schema.

40
amit

Erstens sind die möglichen Werte für die Konfigurationseigenschaft hbm2ddl 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 SessionFactory 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 ein Blogpost für die gängigsten Strategien zur DDL-Erzeugung im Ruhezustand gewidmet:

  1. Der 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 Flyway .

Selbst wenn Sie Flyway verwenden, können Sie das anfängliche Migrationsskript mit hbm2ddl generieren. In diesem Artikel können Sie sehen, wie Sie das JPA-Entitätsmodell mit dem jOOQ-Tabellenmodell kombinieren können.

32
Vlad Mihalcea

hibernate.hbm2ddl.auto überprüft und exportiert DDL automatisch in das Schema, wenn die sessionFactory erstellt wird.

Standardmäßig werden keine Erstellungs- oder Änderungsvorgänge für die DB automatisch ausgeführt. 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">
    
  • validate - Bestehendes Schema validieren

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

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">
    
25
Vinod Kumawat

Wenn Sie keine Strings in Ihrer App verwenden möchten und nach vordefinierten Konstanten suchen, sehen Sie sich die Klasse org.hibernate.cfg.AvailableSettings an, die in der JAR-Datei für den Ruhezustand enthalten ist. Dort finden Sie eine Konstante für alle möglichen Einstellungen. 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";
16
Stefan Haberl

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

SchemaExport Class 

diese Klasse macht Ihre Konfiguration dynamisch. So können Sie die Suiten auswählen, die Ihnen am besten gefallen ...

Checkout [SchemaExport]

7
Vishal Sharma
  • validate: Überprüft das Schema, es wird keine Änderung an der Datenbank vorgenommen.
  • update: Aktualisiert das Schema mit der aktuellen Ausführungsabfrage.
  • create: Erstellt jedes Mal ein neues Schema und löscht vorherige Daten.
  • create-drop: Löscht das Schema, wenn die Anwendung gestoppt oder SessionFactory explizit geschlossen wird.
6
vishal thakur

validate: Überprüft das Schema und nimmt keine Änderungen an der Datenbank vor.
Angenommen, Sie haben der Zuordnungsdatei eine neue Spalte hinzugefügt und führen den Einfügevorgang aus. Dadurch wird eine Ausnahme "Fehlen der XYZ-Spalte" ausgelöst, da sich das vorhandene Schema von dem einzufügenden Objekt unterscheidet. 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 das vorhandene Schema/die vorhandene Tabelle nicht geändert wird.

update: Ä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 mit dem Wert 'NOT NULL' hinzufügen, wird das Hinzufügen dieser bestimmten Spalte zur Datenbank ignoriert. Weil die Tabelle leer sein muss, wenn Sie der vorhandenen Tabelle eine 'NOT NULL'-Spalte hinzufügen möchten.

4
Arun Raaj

Seit 5.0 können Sie diese Werte jetzt in einem dedizierten Enum finden: org.hibernate.boot.SchemaAutoTooling (erweitert um den Wert NONE seit 5.2).

Oder noch besser, seit 5.1 können Sie auch org.hibernate.tool.schema.ActionEnum verwenden, das JPA 2 und "Legacy" kombiniert Msgstr "DDL - Aktionen in den Ruhezustand versetzen.

Aber , Sie können noch nicht programmatisch einen DataSource damit konfigurieren. Es wäre besser, dies in Kombination mit org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO zu verwenden, aber der aktuelle Code erwartet einen Wert für String (Auszug aus SessionFactoryBuilderImpl ):

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

… Und interne enum-Werte von org.hibernate.boot.SchemaAutoTooling und org.hibernate.tool.schema.Action sind nicht öffentlich verfügbar.

Nachfolgend ein Beispiel für eine programmatische DataSource-Konfiguration (die in einer meiner Spring Boot-Anwendungen verwendet wird), die dank .name().toLowerCase() ein Gambit verwendet, aber nur mit Werten ohne Bindestrich funktioniert (nicht _create-drop_):

_@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();
}
_
3
PomCompot