Mysql
 sql >> Datenbank >  >> RDS >> Mysql

@GeneratedValue polymorphe abstrakte Oberklasse über MySQL

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:

  1. 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.
  2. 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 Datenbank GenerationType.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:

  1. Leseoptimistische Transaktion starten.
  2. SELECT MAX(address_id) FROM LAST_IDS
  3. Speichere das Maximum in einer Java-Variablen, z. B.:$OldID.
  4. $NewID =$OldID + 1. (+100 in pessimistischer Sperre)
  5. UPDATE LAST_IDS SET address_id=$newID WHERE address_id=$oldID ?
  6. Committee die read-optimistic Transaktion.
  7. wenn Commit erfolgreich war, speichere $newID zu setID() in der HibernateBean, die Sie speichern möchten.
  8. 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 .