ฉันมีวัตถุบางอย่างในการกำหนดค่านี้เป็นหลัก (แบบจำลองข้อมูลจริงซับซ้อนกว่าเล็กน้อย):
- A มีความสัมพันธ์แบบกลุ่มต่อกลุ่มกับ B (B มี
inverse="true"
) - B มีความสัมพันธ์แบบกลุ่มต่อหนึ่งกับ C (ฉัน
cascade
ตั้งค่าเป็น"save-update"
) - C คือตารางประเภท / หมวดหมู่
นอกจากนี้ฉันควรพูดถึงว่าคีย์หลักถูกสร้างขึ้นโดยฐานข้อมูลเมื่อบันทึก
กับข้อมูลของฉันบางครั้งฉันพบปัญหาที่ A มีชุดของวัตถุ B ที่แตกต่างกันและวัตถุ B เหล่านี้อ้างถึงวัตถุ C เดียวกัน
เมื่อฉันโทรหาsession.saveOrUpdate(myAObject)
ฉันได้รับข้อผิดพลาดในการจำศีลโดยแจ้งว่า: "a different object with the same identifier value was already associated with the session: C"
. ฉันรู้ว่าไฮเบอร์เนตไม่สามารถแทรก / อัปเดต / ลบอ็อบเจ็กต์เดียวกันสองครั้งในเซสชันเดียวกัน แต่มีวิธีแก้ไขบ้างไหม ดูเหมือนจะไม่ใช่เรื่องแปลกของสถานการณ์
ในระหว่างการค้นคว้าปัญหานี้ฉันได้เห็นผู้คนแนะนำให้ใช้session.merge()
แต่เมื่อฉันทำเช่นนั้นวัตถุที่ "ขัดแย้ง" ใด ๆ จะถูกแทรกลงในฐานข้อมูลเป็นวัตถุว่างโดยมีค่าทั้งหมดที่ตั้งค่าเป็นโมฆะ เห็นได้ชัดว่านั่นไม่ใช่สิ่งที่เราต้องการ
[แก้ไข] อีกสิ่งหนึ่งที่ฉันลืมพูดถึงคือ (ด้วยเหตุผลทางสถาปัตยกรรมที่อยู่นอกเหนือการควบคุมของฉัน) การอ่านหรือเขียนแต่ละครั้งจะต้องทำในเซสชั่นแยกต่างหาก