Saya menganggap itu @EmbeddedId
mungkin lebih verbose karena dengan @IdClass
Anda tidak dapat mengakses seluruh objek kunci utama menggunakan operator akses bidang apa pun. Menggunakan @EmbeddedId
Anda dapat melakukannya seperti ini:
@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
@EmbeddedId EmployeeId employeeId;
...
}
Ini memberikan gagasan yang jelas tentang bidang yang membuat kunci komposit karena semuanya dikumpulkan dalam kelas yang diakses melalui operator akses lapangan.
Perbedaan lain dengan @IdClass
dan @EmbeddedId
adalah ketika menulis HQL:
Dengan @IdClass
Anda menulis:
pilih e.name dari Karyawan e
dan dengan @EmbeddedId
Anda harus menulis:
pilih e.employeeId.name dari Karyawan e
Anda harus menulis lebih banyak teks untuk kueri yang sama. Beberapa orang mungkin berpendapat bahwa ini berbeda dari bahasa yang lebih alami seperti yang dipromosikan oleh IdClass
. Tetapi sebagian besar waktu memahami langsung dari permintaan bahwa bidang yang diberikan adalah bagian dari kunci komposit adalah bantuan yang sangat berharga.
@IdClass
walaupun saya lebih suka@EmbeddedId
dalam kebanyakan situasi (Mengetahui hal ini dari sesi oleh Antonio Goncalves. Apa yang dia sarankan adalah kita dapat menggunakan@IdClass
dalam kasus komposit kelas kunci tidak dapat diakses atau datang dari modul lain atau kode warisan di mana kita tidak dapat menambahkan anotasi. Dalam skenario itu@IdClass
akan memberi kita cara kita.@IdClass
anotasi yang diberikan oleh @Gaurav adalah alasan mengapa spesifikasi JPA mencantumkan kedua metode untuk membuat kunci komposit ..@IdClass
dan@EmbeddidId
Ada tiga strategi untuk menggunakan kunci utama majemuk:
@Embeddable
dan tambahkan ke kelas entitas Anda properti normal untuknya, ditandai dengan@Id
.@EmbeddedId
.@Id
, dan tandai kelas entitas Anda@IdClass
, dengan menyediakan kelas kelas kunci utama Anda.Penggunaan
@Id
dengan kelas ditandai sebagai@Embeddable
pendekatan yang paling alami. The@Embeddable
tag dapat digunakan untuk nilai-nilai non primary key embeddable pula. Ini memungkinkan Anda untuk memperlakukan kunci utama majemuk sebagai properti tunggal, dan memungkinkan penggunaan kembali@Embeddable
kelas di tabel lain.Pendekatan paling alami berikutnya adalah penggunaan
@EmbeddedId
tag. Di sini, kelas kunci utama tidak dapat digunakan dalam tabel lain karena itu bukan@Embeddable
entitas, tetapi memungkinkan kita untuk memperlakukan kunci sebagai atribut tunggal dari beberapa kelas.Akhirnya, penggunaan
@IdClass
dan@Id
anotasi memungkinkan kita untuk memetakan kelas kunci primer majemuk menggunakan properti entitas itu sendiri yang sesuai dengan nama properti di kelas kunci primer. Nama-nama harus sesuai (tidak ada mekanisme untuk mengesampingkan ini), dan kelas kunci utama harus menghormati kewajiban yang sama dengan dua teknik lainnya. Satu-satunya keuntungan dari pendekatan ini adalah kemampuannya untuk "menyembunyikan" penggunaan kelas kunci utama dari antarmuka entitas yang melampirkan. The@IdClass
penjelasan mengambil parameter nilai tipe Class, yang harus menjadi kelas yang akan digunakan sebagai kunci utama senyawa. Bidang yang sesuai dengan properti kelas kunci utama yang akan digunakan harus semua dijelaskan dengan@Id
.Referensi: http://www.apress.com/us/book/9781430228509
sumber
Saya menemukan contoh di mana saya harus menggunakan EmbeddedId bukan IdClass. Dalam skenario ini ada tabel bergabung yang memiliki kolom tambahan yang ditentukan. Saya mencoba untuk memecahkan masalah ini menggunakan IdClass untuk mewakili kunci dari entitas yang secara eksplisit mewakili baris dalam tabel bergabung. Saya tidak bisa membuatnya bekerja dengan cara ini. Syukurlah "Java Persistence With Hibernate" memiliki bagian yang didedikasikan untuk topik ini. Salah satu solusi yang diusulkan sangat mirip dengan saya tetapi menggunakan EmbeddedId sebagai gantinya. Saya memodelkan objek saya setelah yang ada di buku itu sekarang berperilaku dengan benar.
sumber
Sejauh yang saya tahu jika komposit PK Anda mengandung FK lebih mudah dan lebih mudah digunakan
@IdClass
Dengan
@EmbeddedId
Anda harus menetapkan pemetaan untuk kolom FK Anda dua kali, masuk@Embeddedable
dan sekali lagi sebagai contoh, di@ManyToOne
mana@ManyToOne
harus dibaca-saja (@PrimaryKeyJoinColumn
) karena Anda tidak dapat memiliki satu kolom yang diatur dalam dua variabel (kemungkinan konflik).Jadi, Anda harus mengatur FK Anda menggunakan tipe sederhana di
@Embeddedable
.Di situs lain menggunakan
@IdClass
situasi ini dapat ditangani lebih mudah seperti yang ditunjukkan di Kunci Primer melalui OneToOne dan Hubungan ManyToOne :Contoh anotasi id JPA 2.0 ManyToOne
Contoh kelas id JPA 2.0
sumber
Saya pikir keuntungan utama adalah bahwa kita dapat menggunakan
@GeneratedValue
id saat menggunakan@IdClass
? Saya yakin kita tidak bisa menggunakan@GeneratedValue
untuk@EmbeddedId
.sumber
Kunci Komposit tidak boleh memiliki
@Id
properti saat@EmbeddedId
digunakan.sumber
Dengan EmbeddedId Anda dapat menggunakan klausa IN di HQL, misalnya: di
FROM Entity WHERE id IN :ids
mana id adalah EmbeddedId sedangkan itu sakit untuk mencapai hasil yang sama dengan IdClass Anda akan ingin melakukan sesuatu sepertiFROM Entity WHERE idPartA = :idPartA0 AND idPartB = :idPartB0 .... OR idPartA = :idPartAN AND idPartB = :idPartBN
sumber