ความแตกต่างของวิธีการผสาน ()
หากคุณต้องการใช้ 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
GO TO FULL VERSION