Was für ein Durcheinander... AUTO_INCREMENT
ist die versteckte Sequenz von MySQL. Das grundlegende Problem ist, dass MySQL
kann das PK nicht gleichzeitig einfügen und zurückgeben, aber Hibernate benötigt dies während INSERT
Erstellen einer neuen Entität.
Die Probleme, auf die Sie stoßen:
- Wenn Hibernate eine neue Entity speichert, versucht er immer, die ID auf die neue EntityBean zu setzen. Daher muss Hibernate lesen, welche ID die Datenbank verwenden wird, bevor Hibernate das neue Tupel in der Tabelle speichert.
- Wenn Sie mehrere Server haben, die auf die Datenbank zugreifen, sollten Sie die Session-Factory von Hibernate entscheiden lassen, die eingebaute Sequenz zu verwenden (AUTO-INCREMENT) oder Hibernate entscheiden lassen (
GenerationType.AUTO
/GenerationType.IDENTITY
) wie groß der offene Bereich reservierter PK's ist (Job eines DB-Architekten). (Wir haben ungefähr 20 Server zu einer Datenbank, also verwenden wir auf einer gut genutzten Tabelle einen PK-Abstand von +100). Wenn nur ein Server Zugriff auf die DatenbankGenerationType.TABLE
hat soll richtig sein.
Hibernate muss die nächste ID selbst mit max(*)+1
berechnen aber:
- Was ist, wenn zwei Anfragen nach
max(*)+1
fragen zur gleichen Zeit/mit dem gleichen Ergebnis? Rechts:Der letzte Versuch,insert
wird versagen.
Sie brauchen also eine Tabelle LAST_IDS
in der Datenbank wer die letzten Table-PK's speichert. Wenn Sie eine hinzufügen möchten, müssen Sie diese Schritte ausführen:
- Leseoptimistische Transaktion starten.
- SELECT MAX(address_id) FROM LAST_IDS
- Speichere das Maximum in einer Java-Variablen, z. B.:$OldID.
- $NewID =$OldID + 1. (+100 in pessimistischer Sperre)
- UPDATE LAST_IDS SET address_id=
$newID
WHERE address_id=$oldID
? - Committee die read-optimistic Transaktion.
- wenn Commit erfolgreich war, speichere
$newID
zusetID()
in der HibernateBean, die Sie speichern möchten. - Lassen Sie schließlich Hibernate die Einfügung aufrufen.
Dies ist der einzige Weg, den ich kenne.
BTW:Hibernate-Entities sollen Vererbung nur verwenden, wenn die Datenbank Vererbung zwischen Tabellen wie PostgreSQL
unterstützt oder Oracle
.