Dari waktu ke waktu ISession
kehendak menjalankan pernyataan SQL yang diperlukan untuk menyinkronkan keadaan koneksi ADO.NET dengan keadaan objek yang disimpan dalam memori. Proses ini, flush, terjadi secara default di titik-titik berikut
- dari beberapa doa
Find()
atauEnumerable()
- dari
NHibernate.ITransaction.Commit()
- dari
ISession.Flush()
Pernyataan SQL dikeluarkan dalam urutan berikut
- semua insersi entitas, dalam urutan yang sama objek terkait disimpan menggunakan
ISession.Save()
- semua pembaruan entitas
- semua penghapusan koleksi
- semua penghapusan, pembaruan, dan sisipan elemen koleksi
- semua sisipan koleksi
- semua penghapusan entitas, dalam urutan yang sama objek terkait dihapus menggunakan
ISession.Delete()
(Pengecualian adalah objek yang menggunakan generasi ID asli dimasukkan saat disimpan.)
Kecuali ketika Anda menjelaskannya Flush()
, sama sekali tidak ada jaminan tentang kapan Sesi mengeksekusi panggilan ADO.NET, hanya urutan di mana mereka dieksekusi . Namun, NHibernate tidak menjamin bahwa ISession.Find(..)
metode tidak akan pernah mengembalikan data basi; mereka juga tidak akan mengembalikan data yang salah.
Dimungkinkan untuk mengubah perilaku default sehingga flush terjadi lebih jarang. The FlushMode
kelas mendefinisikan tiga mode yang berbeda: hanya siram pada komit waktu (dan hanya jika NHibernate ITransaction
API digunakan), siram otomatis menggunakan menjelaskan rutin, atau tidak pernah menyiram kecuali Flush()
disebut secara eksplisit. Mode terakhir berguna untuk unit kerja yang berjalan lama, di mana sebuah ISession
tetap terbuka dan terputus untuk waktu yang lama.
...
Mengakhiri sesi melibatkan empat fase berbeda:
- siram sesi
- melakukan transaksi
- tutup sesi
- menangani pengecualian
Menyiram Sesi
Jika Anda menggunakan ITransaction
API, Anda tidak perlu khawatir tentang langkah ini. Ini akan dilakukan secara implisit ketika transaksi dilakukan. Kalau tidak, Anda harus menelepon ISession.Flush()
untuk memastikan bahwa semua perubahan disinkronkan dengan database.
Melakukan transaksi basis data
Jika Anda menggunakan NHibernate ITransaction API, ini terlihat seperti:
tx.Commit(); // flush the session and commit the transaction
Jika Anda mengelola sendiri transaksi ADO.NET, Anda harus secara manual Commit()
melakukan transaksi ADO.NET.
sess.Flush();
currentTransaction.Commit();
Jika Anda memutuskan untuk tidak melakukan perubahan:
tx.Rollback(); // rollback the transaction
atau:
currentTransaction.Rollback();
Jika Anda mengembalikan transaksi, Anda harus segera menutup dan membuang sesi saat ini untuk memastikan bahwa kondisi internal NHibernate konsisten.
Menutup ISession
Panggilan untuk ISession.Close()
menandai akhir sesi. Implikasi utama dari Close () adalah bahwa koneksi ADO.NET akan dilepaskan oleh sesi.
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
Jika Anda menyediakan koneksi Anda sendiri, Close()
kembalikan referensi ke sana, sehingga Anda bisa menutupnya secara manual atau mengembalikannya ke pool. Kalau tidak, Close()
kembalikan ke kolam renang.