Ada beberapa diskusi di sini tentang entitas JPA dan hashCode()
/ equals()
implementasi yang harus digunakan untuk kelas entitas JPA. Sebagian besar (jika tidak semua) dari mereka bergantung pada Hibernate, tapi saya ingin membahasnya implementasi JPA-netral (saya menggunakan EclipseLink, omong-omong).
Semua implementasi yang mungkin memiliki kelebihan dan kekurangan sendiri mengenai:
hashCode()
/equals()
Kesesuaian kontrak (kekekalan) untukList
/Set
operasi- Apakah objek yang identik (misalnya dari sesi yang berbeda, proksi dinamis dari struktur data yang malas) dapat dideteksi
- Apakah entitas berperilaku benar dalam kondisi terlepas (atau tidak bertahan)
Sejauh yang bisa saya lihat, ada tiga opsi :
- Jangan menimpa mereka; andalkan
Object.equals()
danObject.hashCode()
hashCode()
/equals()
bekerja- tidak dapat mengidentifikasi objek identik, masalah dengan proksi dinamis
- tidak ada masalah dengan entitas yang terpisah
- Timpa mereka, berdasarkan kunci utama
hashCode()
Sayaequals()
rusak- identitas yang benar (untuk semua entitas yang dikelola)
- masalah dengan entitas yang terpisah
- Mengganti mereka, berdasarkan pada Business-Id (bidang kunci non-primer; bagaimana dengan kunci asing?)
hashCode()
Sayaequals()
rusak- identitas yang benar (untuk semua entitas yang dikelola)
- tidak ada masalah dengan entitas yang terpisah
Pertanyaan saya adalah:
- Apakah saya melewatkan opsi dan / atau titik pro / kontra?
- Pilihan apa yang Anda pilih dan mengapa?
PEMBARUAN 1:
Dengan " hashCode()
/ equals()
rusak", maksud saya bahwa hashCode()
pemanggilan yang berurutan dapat mengembalikan nilai yang berbeda, yang (bila diterapkan dengan benar) tidak rusak dalam arti Object
dokumentasi API, tetapi yang menyebabkan masalah ketika mencoba untuk mengambil entitas yang diubah dari Map
,, Set
atau lainnya berbasis hash Collection
. Akibatnya, implementasi JPA (setidaknya EclipseLink) tidak akan berfungsi dengan benar dalam beberapa kasus.
PEMBARUAN 2:
Terima kasih atas jawaban Anda - kebanyakan dari mereka memiliki kualitas luar biasa.
Sayangnya, saya masih tidak yakin pendekatan mana yang akan menjadi yang terbaik untuk aplikasi kehidupan nyata, atau bagaimana menentukan pendekatan terbaik untuk aplikasi saya. Jadi, saya akan membuka pertanyaan dan berharap untuk beberapa diskusi dan / atau pendapat.
hashcode()
instance objek yang sama harus mengembalikan nilai yang sama, kecuali bidang apa pun yang digunakan dalam equals()
perubahan implementasi. Dengan kata lain, jika Anda memiliki tiga bidang di kelas Anda dan equals()
metode Anda hanya menggunakan dua bidang untuk menentukan persamaan contoh, maka Anda dapat mengharapkan nilai hashcode()
pengembalian berubah jika Anda mengubah salah satu dari nilai bidang tersebut - yang masuk akal ketika Anda mempertimbangkan bahwa instance objek ini tidak lagi "sama" dengan nilai yang diwakili oleh instance lama.