วัตถุที่แยกออกจากกันถาวรและชั่วคราวในโหมดไฮเบอร์เนตคืออะไร?


101

วัตถุที่แยกออกจากกันถาวรและชั่วคราวในโหมดไฮเบอร์เนตคืออะไร? กรุณาอธิบายพร้อมตัวอย่าง


ใน session.close จะไม่ลบวัตถุทั้งหมดที่คงอยู่ในขอบเขตเซสชันออกหรือไม่?
Jigar Joshi

ใช่มันจะลบออกดังนั้นเมื่อใดก็ตามที่คุณปิดสถานะคงอยู่ของเซสชันของวัตถุจะถูกแปลงเป็นสถานะแยกออก
Rachel

@Rachel ลิงค์ที่ดีพร้อมรหัสเพื่อความเข้าใจที่ลึกซึ้งยิ่งขึ้น
Priyank Thakkar

คำตอบ:


162

newตัวอย่างของระดับถาวรซึ่งไม่ได้เกี่ยวข้องกับการSessionมีตัวแทนในฐานข้อมูลและไม่มีค่าตัวระบุถือว่าชั่วคราวโดย Hibernate:

Person person = new Person();
person.setName("Foobar");
// person is in a transient state

ถาวรSessionเช่นมีตัวแทนในฐานข้อมูลค่าตัวระบุและมีความเกี่ยวข้องกับ คุณสามารถทำให้อินสแตนซ์ชั่วคราวคงอยู่ได้โดยเชื่อมโยงกับSession:

Long id = (Long) session.save(person);
// person is now in a persistent state

ตอนนี้ถ้าเราcloseเป็น Hibernate Sessionอินสแตนซ์ถาวรจะกลายเป็นอินสแตนซ์ที่แยกออกมามันไม่ได้เชื่อมต่อกับอินสแตนซ์Sessionอีกต่อไป (แต่ยังสามารถแก้ไขและติดตั้งใหม่ได้ในSessionภายหลัง)

ทั้งหมดนี้อธิบายไว้อย่างชัดเจนในบทที่ 10ทั้งหมดการทำงานกับวัตถุในเอกสาร Hibernate ที่ฉันถอดความข้างต้นเท่านั้น แน่นอนต้องอ่าน


ค่าตัวระบุอาจไม่ใช่เงื่อนไขที่เข้มงวดสำหรับวัตถุที่จะคงอยู่เนื่องจากฉันสามารถใช้กลยุทธ์การสร้างตัวระบุที่กำหนดได้
Abhijeet Kashnia

นอกเหนือจากการปิดเซสชันที่อ่านอินสแตนซ์แล้วเราสามารถแยกอินสแตนซ์ออกได้โดยเรียกใช้ session.evict () สิ่งนี้จะลบไม่ให้ถูกจัดการโดย Hibernate (ดังนั้นจึงป้องกันไม่ให้การเปลี่ยนแปลงอินสแตนซ์ถูกส่งกลับไปยังฐานข้อมูลโดยอัตโนมัติ) คุณสามารถส่งการเปลี่ยนแปลงไปยังฐานข้อมูลผ่าน session.update () และแนบอีกครั้งด้วย session.merge ()
Mooshu

1
หลายครั้งเราไม่ปฏิบัติตามเอกสารต้นฉบับที่จัดทำโดยเฟรมเวิร์ก .. ซึ่งบางครั้งก็มีข้อมูลที่ซ่อนอยู่พร้อมคำอธิบายที่เหมาะสมเพียงแค่ต้องสำรวจ มี แต่ความน่าจะหาไม่ได้ง่ายๆ :)
agpt

A persistent instance has a representation in the databaseเอนทิตีถาวรไม่ได้เป็นตัวแทนในฐานข้อมูลก่อนที่จะดำเนินการบันทึก
O.Badr

1
ดังนั้นความแตกต่างของเอนทิตีเดี่ยวและชั่วคราวคือการมีอยู่ของ ID ? ถ้าฉันสร้างอินสแตนซ์ใหม่โดยใช้ id ที่กำหนดอย่างเป็นทางการมันจะเป็นแบบชั่วคราวเพราะมันยังไม่คงอยู่ แต่ไม่สามารถแยกออกจากการแยกออกได้เนื่องจากมี ID ขวา?
Ruslan Stelmachenko

9

วัตถุในโหมดไฮเบอร์เนตมีสถานะดังต่อไปนี้:

ชั่วคราว - วัตถุที่สร้างอินสแตนซ์โดยใช้ตัวดำเนินการใหม่เรียกว่าวัตถุชั่วคราว

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

Persistent - อ็อบเจ็กต์ที่มีข้อมูลประจำตัวฐานข้อมูลที่เกี่ยวข้องเรียกว่าอ็อบเจ็กต์ถาวร

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

แยกออก - อินสแตนซ์ที่แยกออกมาคือออบเจ็กต์ที่ยังคงอยู่ แต่เซสชันถูกปิด

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

http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012


5

ให้ฉันอธิบายในมุมมองของคนเก็บขยะด้วย

มี 3 สถานะวัตถุของการจำศีล (หรือ) ขอบเขตวัตถุของการจำศีล -

  1. สถานะชั่วคราว
  2. สถานะถาวร
  3. สถานะแยก

จะดีกว่าที่จะเข้าใจด้วยตัวอย่างโค้ด -

ให้เราพิจารณาคลาส POJO เป็น Student Object->

Student student = new Student(); 

ตอนนี้วัตถุนักเรียนที่รัฐชั่วคราว


เมื่อเราแนบวัตถุ POJO นี้เข้ากับโหมดไฮเบอร์เนต ->

session.save(student);

ตอนนี้วัตถุ POJO ที่รัฐถาวร

(มุมมองของตัวเก็บขยะ - GC ไม่สามารถลบอ็อบเจ็กต์ใด ๆ ที่อยู่ในสถานะถาวรดังนั้นเราสามารถพูดได้ว่าสถานะถาวรเป็นเหมือนที่เก็บชั่วคราวสำหรับอ็อบเจ็กต์ POJO )


ถ้าเราดำเนินการ ->

session.beginTransaction.commit();

จากนั้นวัตถุ POJO อยู่ที่สถานะหน่วยเก็บถาวรหรือฐานข้อมูล

(มุมมองของตัวรวบรวมขยะ - GC ไม่สามารถลบอ็อบเจ็กต์นี้ได้เนื่องจากอ็อบเจ็กต์ POJO นี้อยู่นอกขอบเขตของ JVM และเก็บไว้ในตารางฟอร์มภายในฐานข้อมูลดังนั้นเราสามารถพูดได้ว่าสถานะการจัดเก็บฐานข้อมูลนี้เป็นเหมือนที่จัดเก็บถาวรสำหรับ POJO วัตถุ )


ถ้าเราดำเนินการ ->

session.evict(student); 

แล้ว POJO วัตถุถูกขับไล่หรือด้านหลังออกจากรัฐถาวรเพื่อ state.Soo แฝดสถานะของวัตถุ POJO นี้จะแฝดรัฐ

(มุมมองของตัวเก็บขยะ - GC สามารถล้างอ็อบเจ็กต์ POJO ที่แยกออกจาก JVM ได้อย่างง่ายดาย)


2

ระบุเอนทิตีต่อไปนี้:

@Entity
public class City {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)    
    private long id;

    // other fields and methods.
}

จากเอกสาร Hibernate 5.2 (ฉันรวมremovedสถานะไว้ด้วย):

ชั่วคราว

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

City city = new City();

มีการจัดการหรือถาวร

เอนทิตีมีตัวระบุที่เกี่ยวข้องและเชื่อมโยงกับบริบทการคงอยู่ อาจมีหรือไม่มีอยู่จริงในฐานข้อมูล

// city will be in a managed/persistent state and any changes to it, will be tracked by hibernate
// and reflected to the database when the persistence context is flushed.
session.save(city);

แยกออก

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

// city is in a detached state, Hibernate is no longer aware of the entity 
session.evict(city)

ลบออก

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

session.remove(city);


หมายเหตุ: Hibernate API ข้อเสนอคู่ของวิธีการที่จะสลับไปมาระหว่างรัฐนิติบุคคลและฉันคิดว่ามันคุ้มค่าในการสำรวจระดับไฮเบอร์เนตเซสชัน


0

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

เพื่อให้แม่นยำยิ่งขึ้นสถานะทั้งสามนี้จะแสดงการเปลี่ยนแปลงของวัตถุไฮเบอร์เนตและสถานะวงจรชีวิตของเซสชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.