ความแตกต่างของวิธีการผสาน ()

หากคุณต้องการใช้ Hibernate เพื่อเปลี่ยนวัตถุที่จัดเก็บไว้ในฐานข้อมูลแล้ว ยังมีหลายวิธีสำหรับการดำเนินการนี้

วิธี แรกคือเมธอดการผสาน ()ซึ่ง จะอัป เดตข้อมูลในฐานข้อมูลตามวัตถุที่ส่งผ่าน สิ่งนี้จะเรียกใช้แบบสอบถาม SQL UPDATE ตัวอย่าง:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

User user2 = (User) session.merge(user);

มีความแตกต่างที่สำคัญหลายประการที่นี่

ขั้นแรก เมธอด การผสาน ()จะส่งคืนผลลัพธ์ซึ่งเป็นวัตถุที่อัปเดต วัตถุนี้มีสถานะคงอยู่และแนบกับวัตถุเซสชัน วัตถุที่ส่งผ่านไปยัง วิธี การผสาน ()ไม่เปลี่ยนแปลง

อาจดูเหมือนว่าไม่มีความแตกต่างระหว่าง user และ user2 แต่ก็ไม่เป็นเช่นนั้น คุณสามารถส่ง วัตถุ POJO ไปยัง เมธอด merge()และด้วยเหตุนี้ เมธอดจึงสามารถส่งคืนพร็อกซี (ขึ้นอยู่กับการตั้งค่าไฮเบอร์เนต) ดังนั้นโปรดจำไว้ว่าเมธอดการผสาน ()จะไม่เปลี่ยนวัตถุที่ส่งผ่าน

ประการที่สอง หากออบเจกต์ที่ส่งผ่านไปยังMerge()มีสถานะชั่วคราว (และไม่มีรหัส) จากนั้นจะมีการสร้างบรรทัดแยกต่างหากสำหรับวัตถุนั้นในฐานข้อมูล กล่าวอีกนัยหนึ่ง คำสั่ง คงอยู่ ()จะถูกดำเนินการ

ประการที่สาม หากออบเจกต์ที่แนบกับเซสชันแล้ว (ที่มีสถานะคงอยู่) ถูกส่ง ไปยังเมธอด merge() ก็จะไม่มีอะไรเกิดขึ้น - เมธอดจะส่งคืนออบเจกต์เดียวกัน ทำไม และทั้งหมดเป็นเพราะเมื่อมีการทำธุรกรรมข้อมูลจะถูกเขียนลงในฐานข้อมูลต่อไป:

User user = new User();
user.setName("Kolyan");
session.save(user);

user.setName("Masha"); //change the object attached to the session

session.close();  //all changed objects will be written to the database

ไม่จำเป็นต้องบันทึกวัตถุทุกครั้งหลังจากการเปลี่ยนแปลงใดๆ หากวัตถุนี้อยู่ในสถานะคงอยู่ Hibernate จะทำทุกอย่างเอง หากคุณเปลี่ยนวัตถุที่ "แนบกับฐาน" การเปลี่ยนแปลงทั้งหมดจะถูกเขียนไปที่ฐาน

ความแตกต่างของเมธอด update()

ไฮเบอร์เนตยังมี เมธอด update()ซึ่งเหมือนกับ เมธอด save()ที่สืบทอดมาจากเวอร์ชันก่อนหน้า ด้วยวิธีนี้ คุณสามารถอัปเดตข้อมูลของวัตถุที่บันทึกไว้แล้วเท่านั้น สิ่งนี้จะเรียกใช้แบบสอบถาม SQL UPDATE ตัวอย่าง:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

session.update(user);

วิธีนี้ไม่ส่งคืนสิ่งใดและไม่เปลี่ยนแปลงวัตถุที่มีอยู่

หากคุณเรียกใช้เมธอดนี้กับวัตถุใหม่ ข้อยกเว้นก็จะเกิดขึ้น:

User user = new User();
user.setName("Kolyan");
session.update(user);   //an exception will be thrown here

วิธีการ saveOrUpdate()

ก่อนการกำเนิดของ JPA ฟังก์ชันของ เมธอดคง อยู่() ถูกดำเนินการโดย เมธอดsaveOrUpdate () งานของเขาคืออัปเดตข้อมูลเกี่ยวกับวัตถุที่มีอยู่ในฐานข้อมูลและหากไม่มีให้สร้างมันขึ้นมา มันมักจะใช้แทนเมธอดsave()และupdate ()

ซึ่งแตกต่างจาก เมธอด update()มันสามารถเปลี่ยนวัตถุที่ส่งผ่านไปยังมันได้ ตัวอย่างเช่น ตั้งค่าเป็น ID ที่กำหนดเมื่อบันทึกลงในฐานข้อมูล ตัวอย่าง:

User user = new User();
user.setName("Kolyan");
session.saveOrUpdate(user);   //object will be written to the database

มันทำงานอย่างไร:

  • หากวัตถุที่ส่งผ่านมี ID วิธีการ UPDATE SQL จะถูกเรียก
  • หากไม่ได้ตั้งค่า ID ของออบเจกต์ที่ผ่าน ระบบจะเรียกเมธอด INSERT SQL