com.something.SuperClass:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class SuperClass implements Serializable {
private static final long serialVersionUID = -695503064509648117L;
long confirmationCode;
@Id
@GeneratedValue(strategy = GenerationType.AUTO) // Causes exception!!!
public long getConfirmationCode() {
return confirmationCode;
}
public void setConfirmationCode(long confirmationCode) {
this.confirmationCode = confirmationCode;
}
}
com.something.SubClass:
@Entity
public abstract class Subclass extends SuperClass {
private static final long serialVersionUID = 8623159397061057722L;
String name;
@Column(nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Beri saya pengecualian ini:
Caused by: org.hibernate.MappingException: Cannot use identity column key
generation with <union-subclass> mapping for: com.something.SuperClass
Apa cara terbaik dan paling nyaman bagi saya untuk menghasilkan ID? Saya tidak ingin mengubah strategi warisan saya.
hibernate
inheritance
jpa
class-table-inheritance
Martijn Pieters
sumber
sumber
Saya ingin tahu apakah ini adalah masalah khusus dialek database, karena menonton tutorial youtube dengan PostgreSQL sebagai database yang mendasarinya, saya melihat bahwa pembuat video berhasil menjalankan aplikasi dengan default @GeneratedValue. Dalam kasus saya (database yang mendasarinya adalah MySQL), saya harus memodifikasi strategi @GeneratedValue menjadi GenerationType.TABLE persis seperti yang diusulkan zoidbeck.
Ini videonya: https://www.youtube.com/watch?v=qIdM4KQOtH8
sumber
GenerationType.SEQUENCE
. Itulah mengapa ia bekerja secara otomatis di sana. Ini sama sekali tidak ada hubungannya dengan PostgreSQLINHERITS
.Setuju dengan jawaban zoidbeck. Anda perlu mengubah strategi menjadi:
Tapi bukan itu saja, Anda perlu membuat tabel baru, yang akan menampung urutan kunci primer tabel abstrak Anda. Ubah pemetaan Anda menjadi
Dan tabel baru dalam database akan terlihat seperti berikut:
Ketika Anda menjalankan aplikasi Anda, Hibernate akan memasukkan baris di mana
sequence_name
akan menjadi nama entitas (SuperClass
dalam contoh ini) dansequence_next_hi_value
nilai akan secara otomatis bertambah dan digunakan untuk catatan baru dari semua tabel subclass yang mengimplementasikan.sumber
Dalam kasus kami, kami menggunakan database PostreSQL untuk dev dan produksi dan database hsqldb dalam memori untuk pengujian. Kami menggunakan urutan dalam kedua kasus untuk menghasilkan id. Tampaknya
GenerationType.AUTO
defaultSEQUENCE
untuk postgres, tetapi gagal dalam tes lokal kami (harus default ke sesuatu yang lain untuk hsqldb).Jadi solusi yang berhasil untuk kami, gunakan secara eksplisit
GenerationType.SEQUENCE
.sumber
Anda dapat menggunakan @MappedSuperclass untuk pewarisan
sumber
Ada Kepatuhan standar SQL di antara MySQL dan PostgreSQL. PostgreSQL Postgres memahami subset SQL92 / 99 yang baik ditambah beberapa fitur berorientasi objek ke subset ini. Postgres mampu menangani rutinitas dan aturan yang kompleks sebagai kueri SQL deklaratif, subkueri, tampilan, dukungan multi-pengguna, transaksi, pengoptimalan kueri, pewarisan, dan array. Tidak mendukung pemilihan data di berbagai database.
MySQL MySQL menggunakan SQL92 sebagai dasarnya. Berjalan di platform yang tak terhitung jumlahnya. Mysql dapat membuat kueri yang dapat menggabungkan tabel dari database yang berbeda. Mendukung gabungan luar kiri dan kanan menggunakan sintaks ANSI dan ODBC. Sejak MySQL 4.1 sejak rilis itu, MySQL akan menangani subkueri. Tampilan didukung pada rilis 5.
Untuk penjelasan rinci, silakan kunjungi. http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html
sumber