มีการบาง อภิปรายนี่เกี่ยวกับหน่วยงานและที่ JPA hashCode()
/ equals()
การดำเนินงานควรจะใช้สำหรับการเรียน JPA นิติบุคคล ส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) ขึ้นอยู่กับ Hibernate แต่ฉันต้องการจะพูดคุยเกี่ยวกับ JPA-Implement-neutrally (ฉันใช้ EclipseLink)
การนำไปใช้งานที่เป็นไปได้ทั้งหมดนั้นมีข้อดีและข้อเสียของตัวเองเกี่ยวกับ:
hashCode()
/ ความequals()
สอดคล้องตามสัญญา(ไม่เปลี่ยนแปลง) สำหรับList
/Set
การดำเนินงาน- ไม่ว่าจะเป็นวัตถุที่เหมือนกัน (เช่นจากเซสชันที่แตกต่างกันพร็อกซีไดนามิกจากโครงสร้างข้อมูลที่โหลดแบบ lazily) สามารถตรวจพบได้
- ไม่ว่าเอนทิตีจะทำงานอย่างถูกต้องในสถานะแยกออก (หรือไม่คงอยู่)
เท่าที่ฉันเห็นมีสามตัวเลือก :
- อย่าแทนที่พวกเขา; พึ่งพา
Object.equals()
และObject.hashCode()
hashCode()
/equals()
งาน- ไม่สามารถระบุวัตถุที่เหมือนกันปัญหาเกี่ยวกับพร็อกซีแบบไดนามิก
- ไม่มีปัญหากับเอนทิตี้เดี่ยว
- แทนที่พวกเขาขึ้นอยู่กับคีย์หลัก
hashCode()
/equals()
ถูกทำลาย- ตัวตนที่ถูกต้อง (สำหรับองค์กรที่มีการจัดการทั้งหมด)
- ปัญหาเกี่ยวกับหน่วยงานเดี่ยว
- แทนที่พวกเขาตามBusiness-Id (เขตข้อมูลคีย์ที่ไม่ใช่หลัก; สิ่งที่เกี่ยวกับกุญแจต่างประเทศ?)
hashCode()
/equals()
ถูกทำลาย- ตัวตนที่ถูกต้อง (สำหรับองค์กรที่มีการจัดการทั้งหมด)
- ไม่มีปัญหากับเอนทิตี้เดี่ยว
คำถามของฉันคือ:
- ฉันพลาดตัวเลือกและ / หรือจุดโปรหรือไม่
- คุณเลือกตัวเลือกอะไรและทำไม?
อัปเดต 1:
โดย " hashCode()
/ equals()
จะแตก" ฉันหมายความว่าเนื่องhashCode()
สวดอาจจะกลับค่าที่แตกต่างกันซึ่งเป็น (เมื่อใช้อย่างถูกต้อง) ไม่เสียในแง่ของObject
เอกสาร API แต่ที่ทำให้เกิดปัญหาเมื่อพยายามที่จะดึงการเปลี่ยนแปลงนิติบุคคลจากMap
, Set
หรืออื่น ๆ Collection
กัญชาตาม ดังนั้นการปรับใช้ JPA (อย่างน้อย EclipseLink) จะไม่ทำงานอย่างถูกต้องในบางกรณี
อัปเดต 2:
ขอบคุณสำหรับคำตอบ - ส่วนใหญ่มีคุณภาพที่น่าทึ่ง
น่าเสียดายที่ฉันยังคงไม่แน่ใจว่าวิธีการใดที่จะดีที่สุดสำหรับแอปพลิเคชันในชีวิตจริงหรือวิธีกำหนดวิธีที่ดีที่สุดสำหรับแอปพลิเคชันของฉัน ดังนั้นฉันจะเปิดคำถามและหวังว่าจะได้มีการพูดคุยและ / หรือความคิดเห็นเพิ่มเติม
hashcode()
ใช้อินสแตนซ์วัตถุเดียวกันควรส่งคืนค่าเดียวกันเว้นแต่ว่าฟิลด์ใด ๆ ที่ใช้ในequals()
การเปลี่ยนแปลงการใช้งาน กล่าวอีกนัยหนึ่งถ้าคุณมีสามเขตข้อมูลในชั้นเรียนของคุณและequals()
วิธีการของคุณใช้เพียงสองเขตข้อมูลเพื่อกำหนดความเท่าเทียมกันของอินสแตนซ์คุณสามารถคาดหวังว่าhashcode()
ค่าส่งคืนจะเปลี่ยนไปถ้าคุณเปลี่ยนค่าใดค่าหนึ่งของเขตข้อมูลเหล่านั้น ที่อินสแตนซ์วัตถุนี้จะไม่ "เท่ากับ" กับค่าที่เป็นตัวแทนอินสแตนซ์เก่าอีกต่อไป