Hibernate hbm2ddl.auto: Werte, Beispiele und Funktionsweise unter der Haube

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum hbm2ddl.auto sowohl Rettung als auch Kopfschmerzen bereitet

\n\n

Jeder, der schon einmal Hibernate (oder Spring Boot + JPA) konfiguriert hat, ist auf die geheimnisvolle Zeile in application.properties oder hibernate.cfg.xml gestoßen:

\n\n
spring.jpa.hibernate.ddl-auto=update\n# oder\nhibernate.hbm2ddl.auto=create\n
\n\n

Auf Stack Overflow hat diese Frage Hunderttausende von Aufrufen gesammelt. Und das zu Recht: Ein falscher Wert kann Ihre Daten zerstören, ein richtiger kann Stunden Arbeit sparen. In diesem Artikel analysieren wir alle möglichen Werte von hibernate.hbm2ddl.auto, zeigen echte Java-Codebeispiele und werfen einen Blick unter die Haube, um zu verstehen, wie Hibernate tatsächlich das Datenbankschema verwaltet.

\n\n

Was ist hbm2ddl.auto und wozu wird es benötigt?

\n\n

Hibernate hbm2ddl.auto ist ein Konfigurationsparameter, der die automatische Erstellung, Aktualisierung oder Überprüfung des Datenbankschemas basierend auf Ihren Entitäten (Entity) steuert. Mit anderen Worten: Hibernate betrachtet die Klassen mit den Annotationen @Entity, @Table, @Column und generiert spontan SQL-Abfragen wie CREATE TABLE, ALTER TABLE usw.

\n\n

Dies ist in der Entwicklungsphase unglaublich praktisch, kann aber in der Produktion zur Katastrophe führen, wenn man nicht versteht, wie jeder Wert intern funktioniert.

\n\n

Vollständige Liste der möglichen Werte von hibernate.hbm2ddl.auto

\n\n

Hibernate unterstützt genau fünf Werte (plus none als Nichtstun):

\n\n
    \n
  • validate — nur Schemaüberprüfung
  • \n
  • update — automatische Aktualisierung
  • \n
  • create — Neuerstellung beim Start
  • \n
  • create-drop — Erstellung beim Start und Löschung beim Stopp
  • \n
  • none — nichts tun (Standardwert)
  • \n
\n\n

Lassen Sie uns jeden Wert im Detail mit Beispielen und einer Erklärung dessen, was „unter der Haube“ passiert, durchgehen.

\n\n

1. validate — Überprüfung, aber keine Änderung

\n\n

Funktionsweise: Beim Start der Anwendung vergleicht Hibernate Ihre Java-Entitäten mit der tatsächlichen Tabellenstruktur in der Datenbank. Wenn alles übereinstimmt, startet die Anwendung. Wenn nicht, wirft Hibernate eine SchemaValidationException.

\n\n

Konfigurationsbeispiel:

\n\n
// application.properties\nspring.jpa.hibernate.ddl-auto=validate\n
\n\n

Beispiel einer Entität:

\n\n
@Entity\n@Table(name = "users")\npublic class User {\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n    \n    @Column(name = "email", nullable = false, length = 255)\n    private String email;\n    \n    @Column(name = "age")\n    private Integer age;\n}\n
\n\n

Was unter der Haube passiert: Hibernate liest die Metadaten der Entität, erstellt eine interne Darstellung der Tabelle users mit den Spalten id, email (NOT NULL, Länge 255), age. Anschließend führt es eine SQL-Abfrage an information_schema (oder das Äquivalent in Ihrer Datenbank) durch und vergleicht Typen, Nullable und Längen. Wenn die Spalte email in der Datenbank den Typ VARCHAR(100) hat, wird ein Fehler ausgegeben.

\n\n

Wann verwenden: Ideal für die Produktion, um sicherzustellen, dass Migrationen (Liquibase/Flyway) die Übereinstimmung mit dem Code nicht verletzt haben.

\n\n

2. update — automatische Aktualisierung (mit Vorsicht!)

\n\n

Funktionsweise: Hibernate fügt selbstständig neue Tabellen, Spalten und Einschränkungen hinzu, wenn diese in der Datenbank nicht vorhanden sind. Es löscht jedoch niemals Spalten oder Tabellen, selbst wenn Sie sie aus dem Java-Code entfernt haben.

\n\n

Konfigurationsbeispiel:

\n\n
// application.properties\nspring.jpa.hibernate.ddl-auto=update\n
\n\n

Beispiel für eine Änderung

Blogs

Buchempfehlungen