บริบทความคงอยู่คืออะไร?


111

ฉันยังใหม่กับโลก Java และ JPA ฉันเรียน JPA และเจอศัพท์ใหม่ ๆ มากมายเช่น Entity, persistence ขณะที่อ่านผมไม่สามารถเข้าใจความหมายที่แน่นอนสำหรับความคงทนบริบท

ใครช่วยอธิบายเป็นฆราวาสง่ายๆ จะทำอย่างไรกับข้อมูลที่ใช้ใน@Entity?

ตัวอย่างเช่นฉันพบว่าคำจำกัดความนี้ซับซ้อนเกินกว่าที่จะเข้าใจ:

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

คำตอบ:


86

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

แม้ว่าจะเกี่ยวข้องกับ Hibernate (ผู้ให้บริการ JPA) แต่ฉันคิดว่าลิงก์เหล่านี้มีประโยชน์:

http://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch03.html

http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/architecture.html

ใน Java EE โดยปกติบริบทการคงอยู่จะถูกเข้าถึงผ่าน EntityManager

http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html

สถานะต่างๆที่เอนทิตีสามารถมีได้และการเปลี่ยนแปลงระหว่างสิ่งเหล่านี้ได้อธิบายไว้ด้านล่าง:

http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/objectstate.html

http://gerrydevstory.com/wp-content/uploads/2012/05/jpa-state-transtition.png


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

4
คอนเทนเนอร์เทียบกับแอปพลิเคชันจะบอกโดยทั่วไปว่าตัวจัดการเอนทิตีถูกสร้างขึ้นที่ไหน - ภายนอกในคอนเทนเนอร์หรือภายในในแอปพลิเคชัน
uiron

66
  1. เอนทิตีได้รับการจัดการโดยอินสแตนซ์javax.persistence.EntityManager โดยใช้บริบทการคงอยู่
  2. แต่ละEntityManagerเช่นมีความเกี่ยวข้องกับบริบทติดตา
  3. ภายในบริบทการคงอยู่อินสแตนซ์ของเอนทิตีและวงจรชีวิตจะได้รับการจัดการ
  4. บริบทความคงอยู่กำหนดขอบเขตภายใต้การสร้างอินสแตนซ์ของเอนทิตีที่เฉพาะเจาะจงคงอยู่และลบออก
  5. บริบทติดตาเป็นเหมือนแคชซึ่งประกอบด้วยชุดของหน่วยงานถาวรดังนั้นเมื่อทำรายการเสร็จสิ้นวัตถุถาวรทั้งหมดจะออกจากบริบทติดตา EntityManager ของและมีการจัดการไม่ได้

1
ฉันพบว่า EclipseLink ไม่แยกเอนทิตีออกหลังจากธุรกรรมเสร็จสิ้น ...
Ray Hulha

แคชของบริบทการคงอยู่ของคอนเทนเนอร์ที่มีการจัดการจะยังคงอยู่ในช่วงเวลาของธุรกรรมเท่านั้น เอนทิตีที่อ่านในธุรกรรมจะถูกแยกออกหลังจากเสร็จสิ้นการทำธุรกรรมและจะต้องมีการรวมเข้าด้วยกันเพื่อแก้ไขในธุรกรรมต่อไป EclipseLink @RayHulha
pritam kumar

4
@pritamkumar คุณอธิบายแนวคิดของบริบทการคงอยู่ได้ดี ฉันแค่เพิ่มว่ายังมีคำอธิบายประกอบ javax.persistence.PersistenceContext ซึ่งใช้ในการฉีดวัตถุ EntityManager และกำหนดขอบเขตของวัตถุที่ฉีดเข้าไป (เช่นธุรกรรม)
Paulo Merson

30

นำมาจากหน้านี้ :

นี่คือสูตรโกงฉบับย่อของโลก JPA:

  • แคชคือสำเนาของข้อมูลคัดลอกความหมายที่ดึงมาจาก แต่อยู่นอกฐานข้อมูล
  • การล้างแคชคือการใส่ข้อมูลที่แก้ไขแล้วกลับเข้าไปในฐานข้อมูล
  • PersistenceContext เป็น Cache เป็นหลัก นอกจากนี้ยังมีแนวโน้มที่จะมีการเชื่อมต่อฐานข้อมูลแบบไม่แชร์เป็นของตัวเอง
  • EntityManager แสดงถึง PersistenceContext (ดังนั้นแคช)
  • EntityManagerFactory สร้าง EntityManager (ดังนั้น PersistenceContext / Cache)

หนึ่ง PersisnteceContext สามารถมีอินสแตนซ์ EntityManager ได้หรือไม่ และ Entity Manager หนึ่งตัวสามารถมี PersistenceContext ได้หรือไม่? PersisntenceContext เป็นเพียงหนึ่งเดียวสำหรับแอปพลิเคชันทั้งหมดหรือไม่
Roberto

7

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


7

ทั้งorg.hibernate.SessionAPI และjavax.persistence.EntityManagerAPI แสดงบริบทสำหรับจัดการกับข้อมูลถาวร

แนวคิดนี้เรียกว่าบริบทติดตา ข้อมูลที่คงอยู่มีสถานะที่สัมพันธ์กับทั้งบริบทการคงอยู่และฐานข้อมูลพื้นฐาน


5

"ชุดของอินสแตนซ์แบบคงอยู่ (เอนทิตี) ที่จัดการโดยอินสแตนซ์ตัวจัดการเอนทิตีในเวลาที่กำหนด" เรียกว่าบริบทการคงอยู่

คำอธิบายประกอบ JPA @Entity บ่งชี้เอนทิตีที่คงอยู่ได้

อ้างอิงคำจำกัดความของ JPA ที่นี่


4

ในแง่คนธรรมดาเราสามารถพูดได้ว่า Persistence Context เป็นสภาพแวดล้อมที่มีการจัดการเอนทิตีกล่าวคือมันจะซิงค์ "เอนทิตี" กับฐานข้อมูล


3

ในขณะที่ @pritam kumar ให้ภาพรวมที่ดีประเด็นที่ 5 นั้นไม่เป็นความจริง

บริบทความคงอยู่อาจเป็นได้ทั้งขอบเขตธุรกรรม - บริบทความคงอยู่ 'ชีวิต' สำหรับความยาวของธุรกรรมหรือขยาย - บริบทความคงอยู่ครอบคลุมธุรกรรมหลายรายการ

https://blogs.oracle.com/carolmcdonald/entry/jpa_caching

EntityManager ของ JPA และ Hibernate's Session นำเสนอบริบทการคงอยู่ที่เพิ่มขึ้น


สวัสดีผู้ใช้ 2771889 คุณพูดถูกฉันไม่ได้กล่าวถึงขอบเขตเพิ่มเติมของบริบทการคงอยู่ จุดที่ 5 เกี่ยวข้องกับบริบทการคงอยู่ของขอบเขตธุรกรรม
pritam kumar

2

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


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