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;
   	}
}

ทำไมมันยากจังคุณถาม?

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