มีการบาง อภิปรายนี่เกี่ยวกับหน่วยงานและที่ 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()ค่าส่งคืนจะเปลี่ยนไปถ้าคุณเปลี่ยนค่าใดค่าหนึ่งของเขตข้อมูลเหล่านั้น ที่อินสแตนซ์วัตถุนี้จะไม่ "เท่ากับ" กับค่าที่เป็นตัวแทนอินสแตนซ์เก่าอีกต่อไป
