เป็นครั้งคราวที่ISession
จะดำเนินการคำสั่ง SQL ที่จำเป็นในการประสานสถานะการเชื่อมต่อ ADO.NET กับสถานะของวัตถุที่เก็บไว้ในหน่วยความจำ กระบวนการนี้จะเกิดขึ้นโดยค่าเริ่มต้น ณ จุดต่อไปนี้
- จากการร้องขอบางอย่างของ
Find()
หรือEnumerable()
- จาก
NHibernate.ITransaction.Commit()
- จาก
ISession.Flush()
คำสั่ง SQL ถูกใช้ตามลำดับต่อไปนี้
- เอนทิตีแทรกทั้งหมดในลำดับเดียวกันวัตถุที่สอดคล้องกันถูกบันทึกไว้โดยใช้
ISession.Save()
- อัพเดตเอนทิตีทั้งหมด
- การลบคอลเล็กชันทั้งหมด
- การลบองค์ประกอบคอลเลกชันทั้งหมดการปรับปรุงและการแทรก
- การแทรกคอลเล็กชันทั้งหมด
- การลบเอนทิตีทั้งหมดในลำดับเดียวกันวัตถุที่เกี่ยวข้องถูกลบโดยใช้
ISession.Delete()
(ข้อยกเว้นคือวัตถุที่ใช้การสร้าง ID เนทิฟจะถูกแทรกเมื่อพวกเขาถูกบันทึกไว้)
ยกเว้นเมื่อคุณอย่างชัดเจนFlush()
มีอย่างค้ำประกันเกี่ยวกับเมื่อเซสชันรัน ADO.NET สายเพียงเพื่อที่พวกเขาจะดำเนินการใด อย่างไรก็ตาม NHibernate รับประกันว่าISession.Find(..)
วิธีการจะไม่ส่งคืนข้อมูลเก่า และพวกเขาจะไม่ส่งคืนข้อมูลที่ไม่ถูกต้อง
เป็นไปได้ที่จะเปลี่ยนพฤติกรรมเริ่มต้นเพื่อให้ฟลัชเกิดขึ้นน้อยลง FlushMode
ระดับกำหนดสามโหมดที่แตกต่างกันเพียงล้างที่กระทำเวลา (และเฉพาะเมื่อ NHibernate ITransaction
API จะใช้) ล้างโดยอัตโนมัติโดยใช้อธิบายกิจวัตรประจำวันหรือไม่เคยล้างเว้นแต่Flush()
จะเรียกว่าอย่างชัดเจน โหมดสุดท้ายมีประโยชน์สำหรับหน่วยงานที่ใช้เวลาทำงานนานซึ่งมีการISession
เปิดและยกเลิกการเชื่อมต่อเป็นเวลานาน
...
การสิ้นสุดเซสชันจะมีสี่ขั้นตอนที่แตกต่างกัน:
- ล้างเซสชั่น
- กระทำธุรกรรม
- ปิดเซสชัน
- จัดการข้อยกเว้น
ล้างเซสชั่น
หากคุณกำลังใช้ITransaction
API อยู่คุณไม่จำเป็นต้องกังวลเกี่ยวกับขั้นตอนนี้ มันจะถูกดำเนินการโดยนัยเมื่อมีการทำธุรกรรม มิฉะนั้นคุณควรโทรติดต่อISession.Flush()
เพื่อให้แน่ใจว่าการเปลี่ยนแปลงทั้งหมดจะถูกซิงโครไนซ์กับฐานข้อมูล
การทำธุรกรรมฐานข้อมูล
หากคุณกำลังใช้ NHibernate ITransaction API สิ่งนี้จะมีลักษณะดังนี้:
tx.Commit(); // flush the session and commit the transaction
หากคุณกำลังจัดการธุรกรรม ADO.NET ด้วยตนเองคุณควรCommit()
ทำธุรกรรม ADO.NET ด้วยตนเอง
sess.Flush();
currentTransaction.Commit();
หากคุณตัดสินใจที่จะไม่ยอมรับการเปลี่ยนแปลง:
tx.Rollback(); // rollback the transaction
หรือ:
currentTransaction.Rollback();
หากคุณย้อนกลับธุรกรรมคุณควรปิดและยกเลิกเซสชันปัจจุบันทันทีเพื่อให้แน่ใจว่าสถานะภายในของ NHibernate สอดคล้องกัน
การปิด ISession
การเรียกเพื่อISession.Close()
ทำเครื่องหมายจุดสิ้นสุดเซสชัน ความหมายหลักของ Close () คือการเชื่อมต่อ ADO.NET จะถูกยกเลิกโดยเซสชัน
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
หากคุณให้การเชื่อมต่อของคุณเองให้Close()
ส่งคืนการอ้างอิงถึงเพื่อให้คุณสามารถปิดได้ด้วยตนเองหรือกลับไปที่กลุ่ม มิฉะนั้นClose()
ส่งคืนไปยังพูล