Rumah > pangkalan data > tutorial mysql > Mengapakah menggunakan @GeneratedValue(strategi = GenerationType.TABLE) dengan superclass abstrak menyebabkan isu dalam aplikasi Spring dengan Hibernate dan MySQL?

Mengapakah menggunakan @GeneratedValue(strategi = GenerationType.TABLE) dengan superclass abstrak menyebabkan isu dalam aplikasi Spring dengan Hibernate dan MySQL?

Barbara Streisand
Lepaskan: 2024-11-10 16:43:02
asal
470 orang telah melayarinya

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

@GeneratedValue Pitfalls dengan Abstract Superclass dan MySQL

Dalam percubaan untuk menguruskan nilai ID dalam aplikasi Spring dengan Hibernate dan MySQL, menggunakan BaseEntity superclass abstrak boleh membawa kepada cabaran. Apabila @GeneratedValue(strategy = GenerationType.TABLE) digunakan, ralat timbul kerana ketiadaan jadual hibernate_sequences yang diperlukan oleh Hibernate untuk menjana ID secara berperingkat.

Isu Asas

MySQL tidak menyokong jujukan secara asli, yang menimbulkan halangan untuk pendekatan GenerationType.JADUAL. Strategi ini biasanya menggunakan jadual khusus untuk menjejak nilai jujukan dan memperuntukkan ID unik. Memandangkan MySQL kekurangan ciri ini, ia mengakibatkan ralat "Jadual 'docbd.hibernate_sequences' tidak wujud".

Menyelesaikan Masalah

Untuk mengatasi isu ini dan mengekalkan objek dengan jayanya, penyelesaian diperlukan:

1. Gunakan GenerationType.IDENTITY

Strategi ini bergantung pada mekanisme autokenaikan pangkalan data sendiri, yang menghapuskan keperluan untuk jadual jujukan khusus. Walau bagaimanapun, ia tidak serasi dengan niat menggunakan superclass abstrak untuk mengurus ID merentas kelas terbitan.

2. Cipta Jadual Jujukan Hibernate

Walaupun MySQL kekurangan sokongan jujukan asli, ia membenarkan penciptaan jadual tersuai untuk meniru tingkah laku jujukan. Berikut ialah contoh mencipta jadual sedemikian bernama 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;
Salin selepas log masuk

3. Konfigurasikan Hibernate untuk Menggunakan Urutan Tersuai

Dalam kelas BaseEntity, laraskan anotasi @GeneratedValue untuk menggunakan jadual jujukan tersuai:

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

@SequenceGenerator(name = "hilo_generator", sequenceName = "hibernate_sequences", allocationSize = 1)
Salin selepas log masuk

4. Laraskan Takrif Lajur dalam Jadual Entiti

Dalam jadual CCD, pastikan definisi lajur id sepadan dengan jujukan tersuai:

CREATE TABLE IF NOT EXISTS ccd(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  #other stuff
) ENGINE=InnoDB;
Salin selepas log masuk

Kaedah Saling Balik

Sebagai langkah terakhir, jika pendekatan jujukan tersuai gagal disebabkan isu lain yang tidak dijangka, pertimbangkan melaksanakan mekanisme penjanaan ID manual dalam kelas BaseEntity:

private static int idSequence = 0;

public Integer getId() {
  if (id == null) {
    return idSequence++;
  }
  return id;
}
Salin selepas log masuk

Kesimpulan

Menggunakan superclass abstrak untuk pengurusan ID dalam aplikasi Spring dengan Hibernate dan MySQL memerlukan berhati-hati pertimbangan had asas pangkalan data. Menggunakan penyelesaian untuk mencipta jadual jujukan tersuai boleh mengurangkan isu yang berpunca daripada kekurangan sokongan jujukan asli MySQL. Walau bagaimanapun, pendekatan ini mungkin mempunyai implikasi prestasi atau memperkenalkan kerumitan tambahan kepada reka bentuk sistem.

Atas ialah kandungan terperinci Mengapakah menggunakan @GeneratedValue(strategi = GenerationType.TABLE) dengan superclass abstrak menyebabkan isu dalam aplikasi Spring dengan Hibernate dan MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan