Daftar Negara

Dan sekarang kesenangan dimulai. Kami akan mempelajari status objek Entitas. Anda harus membayar semuanya, dan untuk menggunakan Hibernate juga. Tidakkah Anda berpikir bahwa mempelajari HQL adalah harga yang mahal? Tidak, hidup ini sedikit lebih rumit.

Jika Anda memiliki semacam objek Entitas yang dapat Anda simpan ke database menggunakan Hibernasi, maka dari sudut pandang Hibernasi, objek ini dapat memiliki empat status:

  • Sementara
  • Persisten (atau Dikelola)
  • Terpisah
  • DIHAPUS

Dan untuk menarik minat Anda, saya akan menambahkan gambar ini ke kuliah ini:

Sementara

Nyatanya, semuanya jauh lebih sederhana dari yang terlihat, meski bukannya tanpa nuansa. Misalnya, setiap objek Entitas yang Anda buat secara eksplisit menggunakan kode Java, dan tidak dimuat dari database menggunakan Hibernate, memiliki status Transient (transparan).

EmployeeEntity employee = new EmployeeEntity();

Status Sementara berarti bahwa Hibernasi tidak tahu tentang objek ini, dan tidak ada tindakan pada objek yang memengaruhi Hibernasi, begitu pula Hibernasi tidak bekerja pada objek ini.

Obyek seperti ini disebut juga POJO-Obyek Jawa Kuno Biasa . Istilah ini sering digunakan sebagai kebalikan dari berbagai objek dengan perilaku rumit. Ingat objek Moc yang dibuat Mockito? Di sini mereka bukan POJO.

Jika beberapa kode klien berfungsi dengan objek dengan status Transient, maka interaksinya dapat dijelaskan dengan skema super sederhana:

Persisten atau Dikelola

Kasus paling umum berikutnya adalah objek yang terkait dengan mesin Hibernasi. Status mereka disebut Persistent (atau Managed). Tepatnya ada dua cara untuk mendapatkan objek dengan status ini:

  • Muat objek dari Hibernasi.
  • Simpan objek di Hibernasi.

Contoh:

Employee employee = session.load(Employee.class, 1);
Employee employee = new Employee ();
session.save(employee);

Objek seperti itu biasanya sesuai dengan beberapa jenis catatan di database, ia memiliki ID dan sejenisnya. Objek ini dilampirkan ke sesi Hibernasi, dan secara umum dapat direpresentasikan bukan oleh objek nyata, tetapi oleh semacam proxy.

Sangat mungkin bahwa setelah memanggil metode session.load() , Anda akan mendapatkan kembali beberapa objek rintisan (proksi), dan semua panggilan ke database hanya akan dilakukan setelah memanggil metode objek ini. Tetapi kita akan membicarakan detail seperti itu nanti.

Dan interaksi antara kode klien dan objek dalam status Terkelola dapat dijelaskan dengan gambar berikut:

Terpisah

Status berikutnya adalah saat objek telah terlepas dari sesi. Yaitu, setelah objek dilampirkan ke sesi Hibernasi, tetapi kemudian sesi ditutup atau transaksi berakhir, dan Hibernasi tidak lagi memantau objek ini.

Contoh:

session.close();
session.evict(entity);

Pada contoh pertama, sesi ditutup. Dalam kasus kedua, kami telah secara eksplisit menunjukkan bahwa kami ingin melepaskan objek dari sesi menggunakan metode evict() .

Skema interaksi kode-objek baru akan terlihat seperti ini:

Dan di sinilah menariknya. Jika objek Anda diperoleh dari Hibernate, kemungkinan besar Anda diberi proxy, bukan objek nyata. Dan objek proxy ini, setelah memutuskan sambungan dari sesi, akan mengeluarkan pengecualian saat metodenya dipanggil.

Ini adalah masalah paling umum untuk semua pemula saat bekerja dengan Hibernasi. Anda perlu tahu persis pada waktu tertentu jawaban atas pertanyaan seperti ini saat Anda bekerja dengan objek Entity :

  • Apakah Anda memiliki objek nyata atau hanya proxy dari objek nyata?
  • Apakah Anda sedang bertransaksi atau tidak?
  • Apakah ini transaksi baca-tulis atau transaksi hanya-baca?
  • Apakah objek dikelola oleh mekanisme LazyLoading?
  • Bagian mana dari objek yang sudah dimuat ke dalam memori, dan bagian mana yang akan dimuat saat diakses?
  • Bagaimana objek Anda terhubung ke objek yang bergantung?

Kabar baiknya adalah bahwa sebagian besar waktu sudah jelas. Tapi Anda masih perlu memahami cara kerjanya di bawah tenda. Pemrograman deklaratif adalah apa adanya - Anda dapat menulis kode dalam 10 menit, memahami mengapa itu tidak berfungsi sebagaimana mestinya - dalam 10 jam :)

DIHAPUS

Dan status terakhir yang dimiliki objek Entitas Anda adalah Dihapus. Seperti yang mungkin sudah Anda duga dari namanya, ini adalah status objek jarak jauh.

Keadaan ini muncul karena jika Anda menghapus beberapa objek dari database, maka objek Java tidak akan langsung hilang kemana-mana.

Employee employee = session.load(Employee.class, 1);
//after loading the object's state is Persisted

session.remove(employee);
//after deletion, the state of the object is Removed

session.save(employee);
//and now Persisted again

session.close();
//and now the Detached state