Heim > Datenbank > MySQL-Tutorial > Hauptteil

Warum verursacht die Verwendung von @GeneratedValue(strategy = GenerationType.TABLE) mit einer abstrakten Superklasse Probleme in einer Spring-Anwendung mit Hibernate und MySQL?

Barbara Streisand
Freigeben: 2024-11-10 16:43:02
Original
387 Leute haben es durchsucht

Why does using @GeneratedValue(strategy = GenerationType.TABLE) with an abstract superclass cause issues in a Spring application with Hibernate and MySQL?

@GeneratedValue Fallstricke mit abstrakter Superklasse und MySQL

Bei einem Versuch, ID-Werte in einer Spring-Anwendung mit Hibernate und MySQL zu verwalten, mithilfe eines Die abstrakte Superklasse BaseEntity kann zu Herausforderungen führen. Wenn @GeneratedValue(strategy = GenerationType.TABLE) verwendet wird, tritt ein Fehler auf, da keine hibernate_sequences-Tabelle vorhanden ist, die Hibernate für die inkrementelle Generierung von IDs benötigt.

Das zugrunde liegende Problem

MySQL unterstützt nativ keine Sequenzen, was ein Hindernis für den GenerationType.TABLE-Ansatz darstellt. Bei dieser Strategie wird typischerweise eine dedizierte Tabelle verwendet, um die Sequenzwerte zu verfolgen und eindeutige IDs zuzuweisen. Da MySQL diese Funktion fehlt, kommt es zu dem Fehler „Tabelle 'docbd.hibernate_sequences' existiert nicht“.

Lösung des Problems

Um dieses Problem zu beheben und Objekte erfolgreich persistieren, ist eine Problemumgehung erforderlich:

1. Verwenden Sie GenerationType.IDENTITY

Diese Strategie basiert auf dem datenbankeigenen automatischen Inkrementierungsmechanismus, wodurch die Notwendigkeit einer dedizierten Sequenztabelle entfällt. Es ist jedoch nicht mit der Absicht vereinbar, eine abstrakte Superklasse zum Verwalten von IDs über abgeleitete Klassen hinweg zu verwenden.

2. Erstellen Sie eine Hibernate-Sequenztabelle

Obwohl MySQL keine native Sequenzunterstützung bietet, ist die Erstellung benutzerdefinierter Tabellen zur Emulation des Sequenzverhaltens möglich. Hier ist ein Beispiel für die Erstellung einer solchen Tabelle mit dem Namen hibernate_sequences:

CREATE TABLE IF NOT EXISTS hibernate_sequences(
  sequence_name VARCHAR(255) NOT NULL,
  sequence_next_hi_value INT UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (sequence_name)
) ENGINE=InnoDB;
Nach dem Login kopieren

3. Konfigurieren Sie Hibernate für die Verwendung der benutzerdefinierten Sequenz

Passen Sie in der BaseEntity-Klasse die Annotation @GeneratedValue an, um die benutzerdefinierte Sequenztabelle zu verwenden:

@GeneratedValue(strategy = GenerationType.TABLE, generator = "hilo_generator")
private Integer id;

@SequenceGenerator(name = "hilo_generator", sequenceName = "hibernate_sequences", allocationSize = 1)
Nach dem Login kopieren

4. Spaltendefinition in der Entitätstabelle anpassen

Stellen Sie in der CCD-Tabelle sicher, dass die ID-Spaltendefinition der benutzerdefinierten Sequenz entspricht:

CREATE TABLE IF NOT EXISTS ccd(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  #other stuff
) ENGINE=InnoDB;
Nach dem Login kopieren

Fallback-Methode

Wenn der benutzerdefinierte Sequenzansatz aufgrund anderer unerwarteter Probleme fehlschlägt, sollten Sie als letzten Ausweg die Implementierung eines manuellen ID-Generierungsmechanismus in der BaseEntity in Betracht ziehen Klasse:

private static int idSequence = 0;

public Integer getId() {
  if (id == null) {
    return idSequence++;
  }
  return id;
}
Nach dem Login kopieren

Fazit

Die Verwendung einer abstrakten Superklasse für die ID-Verwaltung in einer Spring-Anwendung mit Hibernate und MySQL erfordert eine sorgfältige Berücksichtigung der zugrunde liegenden Datenbankbeschränkungen. Die Verwendung der Problemumgehung durch die Erstellung einer benutzerdefinierten Sequenztabelle kann das Problem mildern, das aus der fehlenden nativen Sequenzunterstützung von MySQL resultiert. Diese Ansätze können jedoch Auswirkungen auf die Leistung haben oder das Systemdesign zusätzlich komplex machen.

Das obige ist der detaillierte Inhalt vonWarum verursacht die Verwendung von @GeneratedValue(strategy = GenerationType.TABLE) mit einer abstrakten Superklasse Probleme in einer Spring-Anwendung mit Hibernate und MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage