Apakah objek yang terlepas, persisten, dan sementara dalam hibernasi?

100

Apakah objek yang terlepas, persisten, dan sementara dalam hibernasi? Tolong jelaskan dengan sebuah contoh.

Jigar Joshi
sumber
upon session.close tidak akan menghapus semua objek yang merupakan ketekunan dalam cakupan sesi?
Jigar Joshi
Ya, itu akan menghapus jadi setiap kali Anda menutup sesi status persisten suatu objek diubah ke status terpisah.
Rachel
@Rachel tautan bagus disediakan dengan kode untuk pemahaman yang lebih dalam
Priyank Thakkar

Jawaban:

161

Sebuah newcontoh 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 closemenggunakan mode Hibernasi Session, instans persisten akan menjadi instans terpisah : ia tidak dilampirkan ke a Sessionlagi (tetapi masih dapat dimodifikasi dan dipasang kembali ke yang baru Sessionnanti).

Semua ini dijelaskan dengan jelas di seluruh Bab 10. Bekerja dengan objek dokumentasi Hibernate yang saya hanya parafrase di atas. Pastinya, harus dibaca.

Pascal Thivent
sumber
Nilai pengenal mungkin bukan kondisi yang ketat untuk suatu objek menjadi persisten karena saya dapat menggunakan strategi pembuatan pengenal yang ditetapkan.
Abhijeet Kashnia
Selain menutup sesi yang membaca dalam instance, seseorang dapat melepaskan sebuah instance dengan memanggil session.evict (). Ini menghapusnya agar tidak dikelola oleh Hibernate (sehingga mencegah perubahan pada instance secara otomatis disebarkan kembali ke db). Anda bisa mengirim perubahan ke db melalui session.update (), dan melampirkannya kembali dengan session.merge ().
Mooshu
1
Kami sering tidak mengikuti dokumen asli yang disediakan oleh kerangka kerja .. yang terkadang memiliki informasi tersembunyi dengan deskripsi yang tepat hanya perlu untuk dijelajahi. satu-satunya masalah adalah kita tidak menemukannya dengan mudah :)
agpt
A persistent instance has a representation in the databaseEntitas persisten tidak memiliki representasi dalam database sebelum melakukan operasi penyimpanan.
O.Badr
1
Jadi, perbedaan entitas terpisah dan sementara adalah keberadaan ID ? Jika saya membuat instance baru dengan id yang ditetapkan, maka secara formal itu bersifat sementara, karena belum dipertahankan, tetapi tidak dapat dibedakan dari terlepas, karena memiliki ID. Baik?
Ruslan Stelmachenko
9

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

Sk Sharma
sumber
5

Biar saya jelaskan juga dari sudut pandang Pengumpul Sampah.

Ada 3 status Objek hibernasi (atau) Lingkup Objek hibernate-

  1. Keadaan sementara
  2. keadaan persisten
  3. negara bagian terpisah

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)

Sabunkar Tejas Sahailesh
sumber
2

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 removedstatusnya):

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 .

O. Badr
sumber
0

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

Amol Dixit
sumber