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:
In jedem Fall was ist die beste Lösung?
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,
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?
Es gibt auch den undokumentierten Wert "none", um es vollständig zu deaktivieren.
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.
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.
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:
Im Folgenden sind die wichtigen Punkte zu beachten:
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 das Schema in der Datenbank vorhanden ist: - update das Schema.
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:
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 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.
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">
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";
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]
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.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.
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.Action
Enum
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();
}
_