Zum Inhalt springen
Anjunar/ DOCS

Stabile IDs

Ein Name darf sich ändern, eine ID nie. Daran erkennt das Framework eine Umbenennung statt Löschen und Neuanlegen.

Warum

Hibernate sieht Namen, die Datenbank braucht Identität

Zwischen zwei Versionen einer Entity sieht eine umbenannte Spalte aus wie eine verschwundene und eine neue. Ohne Identität würde jede Umbenennung Daten löschen. @SchemaId gibt jeder Tabelle und Spalte eine Identität, die Umbenennungen übersteht.

scala
@Entity @SchemaId("7f3a9c21") @Table(name = "customer") class Customer: @Id @SchemaId("0a1b2c3d") var id: java.lang.Long = uninitialized @SchemaId("f34e45b6") @Column(name = "nick_name") var nickName: String = uninitialized @Embedded @SchemaId("3c4d5e6f") var address: Address = uninitialized @Embeddable class Address: @SchemaId("9a8b7c6d") var city: String = uninitialized
Regeln

Acht Hex-Ziffern, einmal, für immer

Eine ID besteht aus acht kleinen Hex-Ziffern, zufällig erzeugt. Entity-IDs sind über alle Entities eindeutig, Property-IDs innerhalb ihrer Entity.

Worauf du achten musst
Erzeuge die ID zufällig; leite sie nie aus einem Namen ab.
Ändere eine ID nie und verwende keine wieder: Eine gelöschte ID ist für immer stillgelegt.
Wer eine Entity kopiert, kopiert ihre IDs. Gib der Kopie neue.
Properties in einer jsonb-Spalte brauchen keine ID: Das Framework verwaltet die Spalte, nicht das Dokument.
Adressierung

Wie IDs Tabellen und Spalten benennen

Freigaben, Backfills und Fehlermeldungen sprechen Tabellen und Spalten über einen Pfad aus IDs an. Eine Tabelle nutzt die ID ihrer Entity, eine Spalte hängt die der Property an.

7f3a9c21
Die Tabelle der Entity.
7f3a9c21/f34e45b6
Eine Spalte dieser Tabelle.
7f3a9c21/3c4d5e6f/9a8b7c6d
Eine Spalte eines eingebetteten Werts.
7f3a9c21/5b6c7d8e
Eine Collection-Tabelle (Element-Collection oder Many-to-Many-Join-Tabelle) nimmt die ID ihrer Property.

Vererbung behält diese IDs: Eine Single-Table-Hierarchie teilt die Tabelle ihrer Wurzel, Joined- und Table-per-Class-Unterklassen haben eigene. Eine Join-Spalte ist eine Spalte wie jede andere.

Sekundärtabellen

Eine weitere ID pro Sekundärtabelle

@SecondaryTableId nennt die Tabelle wie @SecondaryTable. Um die Sekundärtabelle umzubenennen, ändere beide Namen und behalte den Wert.

scala
@Entity @SchemaId("7f3a9c21") @SecondaryTable(name = "customer_details") @SecondaryTableId(table = "customer_details", value = "5d6e7f80") class Customer
Fehler

Fehlende IDs stoppen den Start und schlagen eine vor

HibernateSchemaSource liest das Boot-Modell und meldet alle Probleme auf einmal. Eine fehlende oder ungültige ID kommt mit einem frisch erzeugten Vorschlag.

scala
import com.anjunar.hibernateddl.hibernate.HibernateSchemaSource HibernateSchemaSource.read(metadata) match case Left(errors) => errors.foreach(println) case Right(model) => println(s"${model.tables.size} tables")
Ausgabe
Customer.email has no @SchemaId; add e.g. @SchemaId("c41d2e0f")