ตัวเลือกสถานะวัตถุที่เป็นไปได้

ดังที่คุณอาจสังเกตเห็นว่า เมื่อออบเจกต์เชื่อมต่อกับ Hibernate สถานะของออบเจ็กต์จะเรียกว่าPersistentหรือManaged ถูกต้องอย่างไร? คงอยู่หรือจัดการ?

เป็นไปได้และเป็นเช่นนั้น ตามข้อกำหนดของ JPA วัตถุมีสถานะคงอยู่ และตามข้อกำหนดไฮเบอร์เนต สถานะของวัตถุนั้นเรียกว่า Managed

ใน Hibernate การ ทำงานกับฐานข้อมูลจะดำเนินการผ่านวัตถุประเภทorg.hibernate.Session ตาม JPA คลาสควรเรียกว่า javax.persistence.EntityManager นี่ไม่ใช่ปัญหาใหญ่เนื่องจากทั้งสองประเภทเป็นอินเทอร์เฟซ

อินเทอร์เฟซorg.hibernate.Sessionมีการประกาศดังนี้:

interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager,    QueryProducer, java.io.Serializable, SharedSessionContract {

}

ดังนั้น อินเทอร์เฟซเซสชันจึงมีเมธอดทั้งหมดที่อยู่ใน อินเทอร์เฟซ EntityManager แต่ก็มีของตัวเองซึ่งสืบทอดมาจาก Hibernate เวอร์ชันก่อนหน้าเมื่อยังไม่มีข้อมูลจำเพาะของ JPA

สถานการณ์ทั้งหมดนี้อธิบายไว้ดังนี้:

มาดูวิธีการทั้งหมดที่อินเทอร์เฟซเซสชันมีรวมถึงความแตกต่างของงาน

ความแตกต่างของวิธีการคงอยู่ ()

เมื่อบันทึกวัตถุลงในฐานข้อมูล คุณต้องจำสองสิ่ง

ขั้นแรก การบันทึกออบเจกต์จะส่งผลให้มีการดำเนินการหนึ่งในคำสั่ง SQL: INSERT หรือ UPDATE ประการที่สอง การกระทำเหล่านี้จะไม่เกิดขึ้นทันทีหลังจากเรียกใช้เมธอดของวัตถุการประชุมแต่หลังจากปิดธุรกรรมเท่านั้น

ลองพิจารณาสถานการณ์ง่ายๆ เช่น คุณมี คลาส User :

@Entity
public class User {
	@Id
	@GeneratedValue
    public Integer id;

	@Columnt(name=”user_name”)
    public String name;
}

มาบันทึกวัตถุลงในฐานข้อมูลโดยใช้ วิธี การคงอยู่ ( )

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

จุดประสงค์ของวิธีนี้คือการบันทึกวัตถุใหม่ไปยังฐานข้อมูล หากยังไม่มีวัตถุดังกล่าว วัตถุนั้นจะถูกเพิ่มลงในฐานข้อมูลโดยเรียกใช้เมธอดINSERT SQL

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

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

session.evict(user);     // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!

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

เมธอด save() สืบทอดมาจาก Hibernate ปัจจุบันจากเวอร์ชันก่อนหน้า แกนหลักของมันคล้ายกับ วิธี คงอยู่ () มาก และยังเพิ่มระเบียนใหม่ลงในตารางโดยใช้วิธีการ INSERT อย่างไรก็ตาม มีความแตกต่างที่น่าสนใจหลายประการ

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

สำคัญ! ตามข้อกำหนดของ Hibernate ID มันสามารถเป็นอ็อบเจกต์ที่สามารถต่ออนุกรมใดๆ ได้ ไม่ใช่แค่ตัวเลข อาจเป็นสตริง ตัวเลข enum หรืออะไรก็ตามที่สามารถใส่ลงในคอลัมน์เดียวของตารางในฐานข้อมูลได้ทั้งหมด

เมธอดsave()มีประเภทผลลัพธ์เป็นอนุกรม ดังนั้นผลลัพธ์จะต้องถูกแปลงเป็นประเภทที่ถูกต้อง:

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

นอกจากนี้ เมธอด save()มีลักษณะการทำงานที่แตกต่างกันในกรณีของสถานะแยกออกของวัตถุ จะถือว่าวัตถุดังกล่าวเป็นของใหม่และเพิ่มรายการอื่น:

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

session.evict(user); 	// detach the object from the session
Integer id2 = (Integer) session.save(user);

ตัวแปร id และ id2 จะแตกต่างกัน ระเบียนสองรายการจะถูกเพิ่มลงในตารางในฐานข้อมูล หนึ่งระเบียนสำหรับแต่ละการ ดำเนินการ save()