Dalam kode ini, cara membuat kelas Java untuk kunci komposit (cara kunci komposit di hibernasi):
create table Time (
levelStation int(15) not null,
src varchar(100) not null,
dst varchar(100) not null,
distance int(15) not null,
price int(15) not null,
confPathID int(15) not null,
constraint ConfPath_fk foreign key(confPathID) references ConfPath(confPathID),
primary key (levelStation, confPathID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Jawaban:
Untuk memetakan kunci komposit, Anda dapat menggunakan
EmbeddedId
atau yangIdClass
penjelasan. Saya tahu pertanyaan ini tidak sepenuhnya tentang JPA tetapi aturan yang ditentukan oleh spesifikasi juga berlaku. Jadi inilah mereka:Dengan sebuah
IdClass
Kelas untuk kunci primer komposit bisa seperti (bisa menjadi kelas dalam statis):
Dan entitas:
The
IdClass
penjelasan peta beberapa bidang ke PK meja.Dengan
EmbeddedId
Kelas untuk kunci primer komposit bisa seperti (bisa menjadi kelas dalam statis):
Dan entitas:
The
@EmbeddedId
penjelasan peta kelas PK ke meja PK.Perbedaan:
@EmbeddedId
entah bagaimana berkomunikasi lebih jelas bahwa kuncinya adalah kunci komposit dan IMO masuk akal ketika pk gabungan adalah entitas yang bermakna itu sendiri atau digunakan kembali dalam kode Anda .@IdClass
berguna untuk menentukan bahwa beberapa kombinasi bidang adalah unik tetapi ini tidak memiliki arti khusus .Mereka juga memengaruhi cara Anda menulis kueri (membuatnya lebih atau kurang bertele-tele):
dengan
IdClass
dengan
EmbeddedId
Referensi
sumber
id
selalunull
dan tidak dapat dihasilkan: /@IdClass
: "Ini telah diwarisi dari zaman kegelapan EJB 2 untuk kompatibilitas mundur dan kami menyarankan Anda untuk tidak menggunakannya (untuk kesederhanaan)."Anda harus menggunakan
@EmbeddedId
:sumber
Seperti yang saya jelaskan dalam artikel ini , dengan asumsi Anda memiliki tabel database berikut:
Pertama, Anda perlu membuat
@Embeddable
holding identifier komposit:Dengan ini, kita dapat memetakan
Employee
entitas yang menggunakan pengidentifikasi komposit dengan memberi anotasi dengan@EmbeddedId
:The
Phone
entitas yang memiliki@ManyToOne
asosiasi untukEmployee
, perlu referensi identifier komposit dari kelas induk melalui dua@JoinColumn
pemetaan:Untuk lebih jelasnya, lihat artikel ini .
sumber
Kelas kunci utama harus mendefinisikan metode equals dan hashCode
Lebih teknis: Anda harus mengikuti Prinsip Pergantian Liskows dan mengabaikan simetrisitas.
http://www.laliluna.de/jpa-hibernate-guide/ch06s06.html
sumber
Sepertinya Anda melakukan ini dari awal. Coba gunakan alat reverse engineering yang tersedia seperti Netbeans Entities dari Database untuk setidaknya mendapatkan dasar-dasar otomatis (seperti id tertanam). Ini bisa menjadi sakit kepala besar jika Anda memiliki banyak meja. Saya sarankan menghindari menciptakan kembali roda dan menggunakan sebanyak mungkin alat yang tersedia untuk mengurangi pengkodean ke bagian minimum dan paling penting, apa yang ingin Anda lakukan.
sumber
Mari kita ambil contoh sederhana. Katakanlah dua tabel bernama
test
dan dicustomer
sana digambarkan sebagai:Satu lagi meja ada yang melacak
test
dancustomer
:Kita dapat melihat bahwa dalam tabel
tests_purchased
kunci utama adalah kunci komposit, jadi kita akan menggunakan<composite-id ...>...</composite-id>
tag padahbm.xml
file pemetaan. JadiPurchasedTest.hbm.xml
akan terlihat seperti:Tapi itu tidak berakhir di sini. Di Hibernate kami menggunakan session.load (
entityClass
,id_type_object
) untuk menemukan dan memuat entitas menggunakan kunci utama. Dalam kasus kunci komposit, objek ID harus kelas ID yang terpisah (dalam kasus di atasPurchasedTestId
kelas) yang hanya menyatakan atribut kunci utama seperti di bawah ini :Poin penting adalah bahwa kami juga mengimplementasikan dua fungsi
hashCode()
danequals()
sebagai Hibernate bergantung padanya.sumber
Pilihan lain adalah memetakan adalah sebagai Peta elemen komposit dalam tabel ConfPath.
Pemetaan ini akan mendapat manfaat dari indeks aktif (ConfPathID, levelStation).
Pemetaan:
sumber
Kelas Kunci Komposit
Kelas Entitas
sumber