4.1 ธุรกรรมและความสมบูรณ์ของฐานข้อมูล
โหมดการทำงานปกติของฐานข้อมูลคือเมื่อได้รับคำขอนับพันทุก ๆ นาทีจากไคลเอนต์ต่าง ๆ หลายร้อยราย ในกรณีนี้ สถานการณ์มักเกิดขึ้นเมื่อมีการเข้าถึงข้อมูลเดียวกันจากการสืบค้นที่แตกต่างกัน
ไม่บ่อยนัก แต่บางครั้งก็มีสถานการณ์ที่คำขอหนึ่งอ่านบรรทัดหนึ่งและคำขออื่นเปลี่ยนในเวลาเดียวกัน ลองนึกภาพว่าจะเกิดอะไรขึ้นถ้ามีคนอ่านบรรทัดที่เปลี่ยนไปเพียงครึ่งเดียว? ไม่มีอะไรดี
ปัญหานี้แก้ไขได้หลายวิธี ขั้นแรก คุณสามารถล็อกบรรทัดที่เปลี่ยนแปลงได้ ทั้งเพื่อการอ่านและการเขียน วิธีนี้ใช้ได้ผล แต่ความเร็วของฐานจะลดลงอย่างมาก
วิธีที่สองคือการล็อคสตริงสำหรับการเขียนเท่านั้น อย่างไรก็ตาม จะยังคงมีปัญหาเมื่อมีคนพยายามอ่านบรรทัดที่แก้ไขบางส่วน สรุป - ไม่ควรมีสถานการณ์เมื่อบรรทัดมีการเปลี่ยนแปลงบางส่วน
ดังนั้นพวกเขาจึงใช้วิธีที่สาม - การทำธุรกรรม ธุรกรรมคือกลุ่มของการกระทำที่ดำเนินการทั้งหมดหรือไม่มีเลย ไม่สามารถมีสถานการณ์ที่มีการดำเนินการบางส่วนและส่วนที่สองไม่ได้ดำเนินการ หากไม่สามารถทำการเปลี่ยนแปลงทั้งหมดได้ การเปลี่ยนแปลงทั้งหมดที่ทำไปแล้วจะถูกย้อนกลับ
เซิร์ฟเวอร์ SQL สมัยใหม่ใด ๆ อนุญาตให้คุณเปลี่ยนข้อมูลในการทำธุรกรรมเท่านั้น คุณเปิดธุรกรรม ทำการเปลี่ยนแปลงใดๆ กับตารางจำนวนเท่าใดก็ได้ และยอมรับการทำธุรกรรม จากนั้น SQL Server จะพยายามทำการเปลี่ยนแปลง หากทุกอย่างเรียบร้อยดีก็จะถูกเพิ่มลงในฐานข้อมูลทั่วไป หากเกิดปัญหา การเปลี่ยนแปลงทั้งหมดจะถูกยกเลิก
ไฮเบอร์เนตยังใช้กระบวนทัศน์นี้ นั่นคือเหตุผลที่ในการบรรยายครั้งก่อนเราเห็นว่าเมื่อพยายามบันทึกวัตถุพนักงานลงในฐานข้อมูล ธุรกรรมถูกเปิดขึ้นก่อน และหลังจากบันทึกแล้ว ธุรกรรมนั้นถูกคอมมิต
เราจะพูดถึงหัวข้อนี้โดยละเอียดยิ่งขึ้น แต่สำหรับตอนนี้ เพียงแค่รู้ว่าเหตุใดจึงต้องทำธุรกรรมและตำแหน่งที่มักใช้
4.2 รับวัตถุ
หาก Hibernate ดำเนินการตามคำขอเพื่อรับข้อมูล ก็ไม่จำเป็นต้องเปิดธุรกรรมอย่างชัดเจน ไฮเบอร์เนตจะทำเช่นนี้หากเห็นว่าเหมาะสม: มีการตั้งค่าเช่นเดียวกับการตั้งค่าของเซิร์ฟเวอร์ SQL
เราจะวิเคราะห์วิธีการทำงานกับฐานข้อมูล และสิ่งที่ง่ายที่สุดคือการรับวัตถุด้วยID ของ มัน ในการทำเช่น นี้ให้ใช้วิธีการget()
บน วัตถุ เซสชัน แบบฟอร์มทั่วไปของคำขอดังกล่าว:
Class Name = session.get(Class.class, ID);
ตัวอย่าง:
public User getUserById(Integer id) {
try (Session session = sessionFactory.openSession()) {
User user = session.get(User.class, id);
return user;
}
}
4.3 การบันทึก (เพิ่ม) วัตถุ
หากคุณต้องการบันทึกออบเจกต์ของคุณลงในฐานข้อมูล คิวรีจะถูกดำเนินการที่ระดับ SQLแทรก. ดังนั้น การดำเนินการของคุณต้องทำเป็นธุรกรรมแยกต่างหาก นอกจากนี้ ควรใช้ เมธอด persist()
ของวัตถุเซสชัน เพื่อการคง อยู่
แบบฟอร์มทั่วไปของคำขอดังกล่าว:
session.persist(An object);
วิธีการpersist()
เปลี่ยนไม่เพียง แต่ฐานเท่านั้น แต่ยังรวมถึงวัตถุด้วย สิ่งสำคัญคือเมื่อเราเพิ่มวัตถุ ลงในฐานข้อมูล วัตถุนี้ยังไม่มีID ของตัวเองก่อนที่จะเพิ่มเข้าไป ก็มักจะเป็นเช่นนั้นแม้ว่าจะมีความแตกต่าง และหลังจากเพิ่มวัตถุ แล้ว มีID
public boolean saveUser(User user) {
try (Session session = sessionFactory.openSession()) {
Transaction transaction = session.beginTransaction();
session.persist(user);
transaction.commit();
return true;
}
catch() {
return false;
}
}
วัตถุ เซสชั่นยังมีวิธีการsave()
ที่ทำหน้าที่คล้ายกัน เป็นเพียงวิธีการที่save()
เป็นมาตรฐานไฮเบอร์เนตเก่าและวิธีการpersist()
ที่เป็นมาตรฐาน JPA
4.4 การลบวัตถุ
หากคุณต้องการลบวัตถุที่มีอยู่ ก็ทำได้ง่ายมาก ในการทำเช่นนี้ วัตถุเซสชันมีวิธีการพิเศษremove()
-
แบบฟอร์มทั่วไปของคำขอดังกล่าว:
session.remove(An object);
และแน่นอน ลองเขียนโค้ดด้วยตัวอย่าง:
public boolean removeUser(User user) {
try (Session session = sessionFactory.openSession()) {
Transaction transaction = session.beginTransaction();
session.remove(user);
transaction.commit();
return true;
}
catch() {
return false;
}
}
ทำไมมันยากจังคุณถาม?
ก่อนอื่นเลย การเปลี่ยนแปลงใด ๆ กับฐานข้อมูลมักมีผลลัพธ์ที่แตกต่างกันและไม่ชัดเจนเสมอไป และประการที่สอง วัตถุนี้อาจมีวัตถุย่อยที่เกี่ยวข้อง เป็นต้น ดังนั้น สถานการณ์การลบจึงมักไม่ใช่เรื่องเล็กน้อย