วัตถุที่แยกออกจากกันถาวรและชั่วคราวในโหมดไฮเบอร์เนตคืออะไร? กรุณาอธิบายพร้อมตัวอย่าง
วัตถุที่แยกออกจากกันถาวรและชั่วคราวในโหมดไฮเบอร์เนตคืออะไร? กรุณาอธิบายพร้อมตัวอย่าง
คำตอบ:
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 ที่ฉันถอดความข้างต้นเท่านั้น แน่นอนต้องอ่าน
A persistent instance has a representation in the database
เอนทิตีถาวรไม่ได้เป็นตัวแทนในฐานข้อมูลก่อนที่จะดำเนินการบันทึก
วัตถุในโหมดไฮเบอร์เนตมีสถานะดังต่อไปนี้:
ชั่วคราว - วัตถุที่สร้างอินสแตนซ์โดยใช้ตัวดำเนินการใหม่เรียกว่าวัตถุชั่วคราว
ออบเจ็กต์เป็นวัตถุชั่วคราวหากเพิ่งถูกสร้างอินสแตนซ์โดยใช้ตัวดำเนินการใหม่และไม่เกี่ยวข้องกับไฮเบอร์เนตเซสชัน ไม่มีการแสดงอย่างต่อเนื่องในฐานข้อมูลและไม่มีการกำหนดค่าตัวระบุ อินสแตนซ์ชั่วคราวจะถูกทำลายโดยตัวรวบรวมขยะหากแอปพลิเคชันไม่มีการอ้างอิงอีกต่อไป
Persistent - อ็อบเจ็กต์ที่มีข้อมูลประจำตัวฐานข้อมูลที่เกี่ยวข้องเรียกว่าอ็อบเจ็กต์ถาวร
อินสแตนซ์ถาวรมีการแสดงในฐานข้อมูลและค่าตัวระบุ มันอาจถูกบันทึกหรือโหลดแล้ว อย่างไรก็ตามเป็นไปตามคำจำกัดความในขอบเขตของเซสชัน ไฮเบอร์เนตจะตรวจจับการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับวัตถุในสถานะถาวรและซิงโครไนซ์สถานะกับฐานข้อมูลเมื่อหน่วยการทำงานเสร็จสมบูรณ์
แยกออก - อินสแตนซ์ที่แยกออกมาคือออบเจ็กต์ที่ยังคงอยู่ แต่เซสชันถูกปิด
สามารถแนบอินสแตนซ์ที่แยกออกจากเซสชันใหม่ได้ในเวลาต่อมาทำให้อินสแตนซ์ยังคงอยู่อีกครั้ง คุณลักษณะนี้เปิดใช้งานโมเดลการเขียนโปรแกรมสำหรับหน่วยงานที่ทำงานเป็นเวลานานซึ่งต้องใช้เวลาคิดของผู้ใช้ เราเรียกพวกเขาว่าธุรกรรมแอปพลิเคชันกล่าวคือหน่วยงานจากมุมมองของผู้ใช้
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
ให้ฉันอธิบายในมุมมองของคนเก็บขยะด้วย
มี 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 ได้อย่างง่ายดาย)
ระบุเอนทิตีต่อไปนี้:
@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 ข้อเสนอคู่ของวิธีการที่จะสลับไปมาระหว่างรัฐนิติบุคคลและฉันคิดว่ามันคุ้มค่าในการสำรวจระดับไฮเบอร์เนตเซสชัน
นอกจากคำตอบที่ถูกต้องที่ระบุไว้แล้วถาวรชั่วคราวแยกออกเป็นเพียงสถานะของวัตถุในโหมดไฮเบอร์เนต
เพื่อให้แม่นยำยิ่งขึ้นสถานะทั้งสามนี้จะแสดงการเปลี่ยนแปลงของวัตถุไฮเบอร์เนตและสถานะวงจรชีวิตของเซสชัน