Senarai Negeri

Dan kini keseronokan bermula. Kami akan mengkaji keadaan objek Entiti. Anda perlu membayar untuk segala-galanya, dan untuk menggunakan Hibernate juga. Korang rasa tak belajar HQL ni harga macam tu? Tidak, hidup ini sedikit lebih rumit.

Jika anda mempunyai beberapa jenis objek Entiti yang anda boleh simpan ke pangkalan data menggunakan Hibernate, maka dari sudut pandangan Hibernate, objek ini boleh mempunyai empat keadaan:

  • sementara
  • Berterusan (atau Terurus)
  • Terpisah
  • Dialih keluar

Dan untuk menarik minat anda, saya akan menambah gambar ini pada kuliah ini:

sementara

Malah, semuanya jauh lebih mudah daripada yang kelihatan, walaupun tidak tanpa nuansa. Contohnya, setiap objek Entiti yang anda cipta secara eksplisit menggunakan kod Java dan tidak dimuatkan daripada pangkalan data menggunakan Hibernate, mempunyai status Transient (telus).

EmployeeEntity employee = new EmployeeEntity();

Status Transient bermakna Hibernate tidak tahu tentang objek ini, dan tiada tindakan pada objek mempengaruhi Hibernate, begitu juga kerja Hibernate pada objek ini.

Objek sedemikian juga dipanggil POJO - Plain Old Java Object . Istilah ini sering digunakan sebagai bertentangan dengan pelbagai objek dengan tingkah laku yang rumit. Ingat objek Moc yang dibuat oleh Mockito? Di sini mereka bukan POJO.

Jika sesetengah kod pelanggan berfungsi dengan objek dengan status Transient, maka interaksi mereka boleh diterangkan dengan skema yang sangat mudah:

Gigih atau Terurus

Kes paling biasa seterusnya ialah objek yang berkaitan dengan enjin Hibernate. Status mereka dipanggil Gigih (atau Terurus). Terdapat dua cara untuk mendapatkan objek dengan status ini:

  • Muatkan objek dari Hibernate.
  • Simpan objek dalam Hibernate.

Contoh:

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

Objek sedemikian biasanya sepadan dengan beberapa jenis rekod dalam pangkalan data, ia mempunyai ID dan sebagainya. Objek ini dilampirkan pada sesi Hibernate, dan secara umum boleh diwakili bukan oleh objek sebenar, tetapi oleh beberapa jenis proksi.

Ada kemungkinan bahawa selepas memanggil kaedah session.load() , anda akan mendapat kembali beberapa objek stub (proksi), dan semua panggilan ke pangkalan data akan dilakukan hanya selepas memanggil kaedah objek ini. Tetapi kita akan bercakap tentang butiran sedemikian sedikit kemudian.

Dan interaksi antara kod klien dan objek dalam status Terurus boleh diterangkan dengan gambar berikut:

Terpisah

Keadaan seterusnya ialah apabila objek telah ditanggalkan daripada sesi. Iaitu, sebaik sahaja objek dilampirkan pada sesi Hibernate, tetapi kemudian sesi ditutup atau transaksi berakhir, dan Hibernate tidak lagi memantau objek ini.

Contoh:

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

Dalam contoh pertama, sesi telah ditutup. Dalam kes kedua, kami telah menyatakan dengan jelas bahawa kami ingin menanggalkan objek daripada sesi menggunakan kaedah evict() .

Skim interaksi objek kod baharu akan kelihatan seperti ini:

Dan di sinilah ia menjadi menarik. Jika objek anda diperoleh daripada Hibernate, kemungkinan besar anda diberi proksi dan bukannya objek sebenar. Dan objek proksi ini, selepas memutuskan sambungan dari sesi, akan membuang pengecualian apabila kaedahnya dipanggil.

Ini adalah masalah yang paling biasa untuk semua pemula apabila bekerja dengan Hibernate. Anda perlu mengetahui dengan tepat pada bila-bila masa jawapan kepada soalan seperti ini apabila anda bekerja dengan objek Entiti :

  • Adakah anda mempunyai objek sebenar atau hanya proksi daripada objek sebenar?
  • Adakah anda sedang melakukan transaksi atau tidak?
  • Adakah ia transaksi baca-tulis atau transaksi baca sahaja?
  • Adakah objek diuruskan oleh mekanisme LazyLoading?
  • Bahagian objek yang manakah telah dimuatkan ke dalam memori, dan bahagian manakah yang akan dimuatkan apabila diakses?
  • Bagaimanakah objek anda disambungkan kepada objek bergantung?

Berita baiknya ialah kebanyakan masa ia jelas. Tetapi anda masih perlu memahami bagaimana semuanya berfungsi di bawah tudung. Pengaturcaraan deklaratif adalah apa itu - anda boleh menulis kod dalam 10 minit, faham mengapa ia tidak berfungsi sebagaimana mestinya - dalam 10 jam :)

Dialih keluar

Dan keadaan terakhir yang boleh dimiliki oleh objek Entiti anda ialah Dialih keluar. Seperti yang anda mungkin sudah meneka dari namanya, ini adalah keadaan objek jauh.

Keadaan ini muncul kerana fakta bahawa jika anda memadamkan beberapa objek dari pangkalan data, maka objek Java tidak akan hilang serta-merta di mana-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