Apakah objek yang terlepas, persisten, dan sementara dalam hibernasi? Tolong jelaskan dengan sebuah contoh.
Apakah objek yang terlepas, persisten, dan sementara dalam hibernasi? Tolong jelaskan dengan sebuah contoh.
Jawaban:
Sebuah new
contoh dari kelas persisten yang tidak terkait dengan a Session
, tidak memiliki representasi dalam database dan tidak ada nilai pengenal yang dianggap sementara oleh Hibernate:
Person person = new Person();
person.setName("Foobar");
// person is in a transient state
Sebuah gigih misalnya memiliki perwakilan di database, nilai pengenal dan berhubungan dengan Session
. Anda dapat membuat instance sementara menjadi persisten dengan mengaitkannya dengan Session
:
Long id = (Long) session.save(person);
// person is now in a persistent state
Sekarang, jika kita close
menggunakan mode Hibernasi Session
, instans persisten akan menjadi instans terpisah : ia tidak dilampirkan ke a Session
lagi (tetapi masih dapat dimodifikasi dan dipasang kembali ke yang baru Session
nanti).
Semua ini dijelaskan dengan jelas di seluruh Bab 10. Bekerja dengan objek dokumentasi Hibernate yang saya hanya parafrase di atas. Pastinya, harus dibaca.
A persistent instance has a representation in the database
Entitas persisten tidak memiliki representasi dalam database sebelum melakukan operasi penyimpanan.
Objek dalam hibernasi memiliki status berikut:
Transient - Objek yang dibuat menggunakan operator baru disebut objek transien.
Objek bersifat sementara jika baru saja dibuat menggunakan operator baru, dan tidak terkait dengan Sesi Hibernasi. Ini tidak memiliki representasi persisten dalam database dan tidak ada nilai pengenal yang telah ditetapkan. Instance transien akan dihancurkan oleh pengumpul sampah jika aplikasi tidak lagi memiliki referensi.
Persisten - Objek yang memiliki identitas database yang terkait dengannya disebut objek persisten.
Instance persisten memiliki representasi dalam database dan nilai pengenal. Mungkin saja disimpan atau dimuat; namun, menurut definisi dalam ruang lingkup Sesi. Hibernate akan mendeteksi perubahan apa pun yang dibuat pada objek dalam status persisten dan menyinkronkan status dengan database saat unit kerja selesai.
Dilepas - Instance yang terlepas adalah objek yang persisten, tetapi Sesi-nya telah ditutup.
Instance yang terlepas dapat dilampirkan kembali ke Sesi baru di lain waktu, membuatnya tetap ada lagi. Fitur ini memungkinkan model pemrograman untuk unit kerja yang berjalan lama yang membutuhkan waktu berpikir pengguna. Kami menyebutnya transaksi aplikasi, yaitu unit kerja dari sudut pandang pengguna.
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
Biar saya jelaskan juga dari sudut pandang Pengumpul Sampah.
Ada 3 status Objek hibernasi (atau) Lingkup Objek hibernate-
Lebih baik memahami dengan contoh kode-
Mari kita pertimbangkan kelas POJO sebagai Student Object->
Student student = new Student();
Sekarang, objek siswa ini dalam keadaan transient .
Saat kita memasang objek POJO ini ke sesi hibernasi->
session.save(student);
Sekarang objek POJO ini dalam keadaan persisten .
(Sudut pandang pengumpul sampah- GC tidak dapat menghapus Objek apa pun yang berada dalam status persisten. Jadi, dapat dikatakan bahwa status persisten seperti penyimpanan sementara untuk objek POJO )
Jika kita tampil->
session.beginTransaction.commit();
maka objek POJO berada pada status penyimpanan Permanen atau Database
(Sudut pandang pengumpul sampah- GC tidak dapat menghapus objek ini karena objek POJO ini sekarang berada di luar cakupan JVM dan disimpan dalam tabel formulir di dalam database. Jadi, kita dapat mengatakan bahwa status penyimpanan Database ini seperti penyimpanan permanen untuk POJO benda )
Jika kita tampil->
session.evict(student);
kemudian objek POJO diusir atau dihapus kembali dari status persisten ke status terlepas. Jadi, status objek POJO ini adalah status terlepas .
(Sudut pandang pengumpul sampah- GC dapat dengan mudah menghapus objek POJO status terlepas dari JVM)
Diberikan entitas berikut:
@Entity
public class City {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
// other fields and methods.
}
Dari dokumentasi Hibernate 5.2 (Saya juga menyertakan removed
statusnya):
sementara
entitas baru saja dibuat dan tidak terkait dengan konteks persistensi. Ini tidak memiliki representasi persisten dalam database dan biasanya tidak ada nilai pengenal yang telah ditetapkan (kecuali generator yang ditetapkan digunakan).
City city = new City();
dikelola, atau gigih
entitas memiliki pengenal terkait dan dikaitkan dengan konteks ketekunan. Ini mungkin atau mungkin belum ada secara fisik dalam database.
// 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);
terpisah
entitas memiliki pengenal terkait, tetapi tidak lagi terkait dengan konteks persistensi (biasanya karena konteks persistensi ditutup atau instance telah dikeluarkan dari konteks)
// city is in a detached state, Hibernate is no longer aware of the entity
session.evict(city)
dihapus
entitas memiliki pengenal terkait dan dikaitkan dengan konteks ketekunan, namun entitas ini dijadwalkan untuk dihapus dari database.
session.remove(city);
Catatan:
Hibernate API menawarkan pasangan metode untuk beralih antar status entitas, dan menurut saya ada baiknya menjelajahi kelas Sesi Hibernasi .
Di samping jawaban yang benar sudah teridentifikasi persisten, sementara, terlepas hanyalah status objek dalam hibernasi.
Untuk lebih tepatnya, ketiga status ini benar-benar menunjukkan perubahan objek hibernasi dan status siklus hidup sesi