Migration beim Start
Der Server migriert seine Datenbank, bevor er die SessionFactory baut. Stimmt etwas nicht, startet er nicht.
Der Normalfall: eine Hibernate-Einstellung
Mit schema-integration im Klassenpfad schalten Hibernate-Einstellungen die Migration ein. Während Hibernate die SessionFactory baut, noch vor der eigenen Validierung, liest der Integrator die Entities und migriert über eine Verbindung von Hibernate.
Wenn der Server den Bootstrap selbst steuert
Mit JTA oder Multi-Tenancy verweigert der Integrator. Rufe die Migration dann selbst auf, zwischen Metadaten und SessionFactory, mit einer DataSource, deren Verbindungen nicht in JTA eingebunden sind.
migrate läuft synchron. Mit jedem MigrationStatus darf der Server weiterlaufen; eine MigrationException muss den Start abbrechen. Einstellungen in der Registry verfeinern die übergebenen Optionen.
Keine Migrationsskripte, keine Snapshots
Jede Migration speichert ihr Zielmodell als JSON in __hibernate_ddl.schema_history. Der nächste Start plant gegen dieses Modell. Weil IDs über alle Versionen stabil sind, darf ein Server Versionen überspringen. Ohne Historie ist das vorige Modell leer, und alle Tabellen werden angelegt.
- Applied
- Änderungen wurden geplant und ausgeführt; eine neue Revision ist geschrieben.
- AlreadyApplied
- Die Datenbank entspricht bereits dem Ziel; nur geprüft.
- Adopted
- Eine Datenbank ohne Historie entsprach dem Ziel und wurde Revision 1.
- ManuallyMigrated
- Ein von Hand migriertes Ziel wurde geprüft und eingetragen.
Was unter der Sperre passiert
Unter einer transaktionalen Advisory-Sperre prüft der Executor die Historie, plant die Änderungen, vergleicht die Datenbank mit dem gespeicherten Modell, führt das DDL aus, prüft das Ziel und schreibt die neue Revision, alles in einer Transaktion.
Handänderungen stoppen den Start
Eine Datenbank, die vom gespeicherten Modell abweicht, wird nicht weiter migriert.
Ein älterer Server startet nicht
Nach einer neueren Migration würde ein älteres Modell zurückbenennen oder löschen. Das wird abgelehnt.
Andere Knoten arbeiten weiter
Ein Start ohne Änderungen prüft nur unter einer geteilten Sperre; laufende Knoten lesen und schreiben weiter.
Eine Migration mit Änderungen sperrt ihre Tabellen exklusiv bis zum Commit. Plane große Änderungen für ein Wartungsfenster.