@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;
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)
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;
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; }
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!