Listahan ng mga Estado

At ngayon magsisimula ang saya. Pag-aaralan natin ang mga estado ng mga object ng Entity. Kailangan mong magbayad para sa lahat, at para sa paggamit din ng Hibernate. Hindi mo ba naisip na ang pag-aaral ng HQL ay isang presyo? Hindi, ang buhay ay medyo mas kumplikado.

Kung mayroon kang ilang uri ng Entity object na maaari mong i-save sa database gamit ang Hibernate, pagkatapos ay mula sa punto ng view ng Hibernate, ang object na ito ay maaaring magkaroon ng apat na estado:

  • Lumilipas
  • Persistent (o Pinamamahalaan)
  • Hiwalay
  • Inalis

At para interesado ka, idaragdag ko ang larawang ito sa lecture na ito:

Lumilipas

Sa katunayan, ang lahat ay mas simple kaysa sa tila, bagaman hindi walang mga nuances. Halimbawa, ang bawat object ng Entity na tahasan mong ginawa gamit ang Java code, at hindi nag-load mula sa database gamit ang Hibernate, ay may Transient (transparent) na status.

EmployeeEntity employee = new EmployeeEntity();

Ang Transient status ay nangangahulugan na ang Hibernate ay walang ideya tungkol sa object na ito, at walang aksyon sa object ang makakaapekto sa Hibernate, o ang Hibernate's work sa object na ito.

Ang mga naturang bagay ay tinatawag ding POJO - Plain Old Java Object . Ang termino ay kadalasang ginagamit bilang kabaligtaran ng iba't ibang mga bagay na may nakakalito na pag-uugali. Tandaan ang mga bagay ng Moc na nilikha ni Mockito? Dito hindi sila POJO.

Kung gumagana ang ilang code ng kliyente sa isang bagay na may Transient status, maaaring ilarawan ang kanilang pakikipag-ugnayan sa pamamagitan ng napakasimpleng pamamaraan:

Persistent o Pinamamahalaan

Ang susunod na pinakakaraniwang kaso ay ang mga bagay na nauugnay sa Hibernate engine. Ang kanilang katayuan ay tinatawag na Persistent (o Managed). Mayroong eksaktong dalawang paraan upang makakuha ng isang bagay na may ganitong katayuan:

  • Mag-load ng object mula sa Hibernate.
  • I-save ang object sa Hibernate.

Mga halimbawa:

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

Ang ganitong bagay ay karaniwang tumutugma sa ilang uri ng rekord sa database, mayroon itong ID at iba pa. Ang bagay na ito ay naka-attach sa session ng Hibernate, at sa pangkalahatan ay maaaring katawanin hindi ng isang tunay na bagay, ngunit sa pamamagitan ng ilang uri ng proxy.

Posible na pagkatapos tawagan ang session.load() method , babalik ka ng ilang stub object (proxy), at lahat ng mga tawag sa database ay isasagawa lamang pagkatapos tawagan ang mga pamamaraan ng object na ito. Ngunit pag-uusapan natin ang mga naturang detalye sa ibang pagkakataon.

At ang pakikipag-ugnayan ng client code at ang object sa Managed status ay maaaring ilarawan sa sumusunod na larawan:

Hiwalay

Ang susunod na estado ay kapag ang bagay ay nahiwalay sa session. Iyon ay, kapag ang object ay naka-attach sa Hibernate session, ngunit pagkatapos ay ang session ay isinara o ang transaksyon ay natapos, at ang Hibernate ay hindi na sinusubaybayan ang object na ito.

Halimbawa:

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

Sa unang halimbawa, ang session ay sarado. Sa pangalawang kaso, tahasan naming ipinahiwatig na gusto naming tanggalin ang bagay mula sa session gamit ang evict() method .

Ang bagong scheme ng pakikipag-ugnayan ng code-object ay magiging ganito:

At narito kung saan ito nagiging kawili-wili. Kung nakuha ang iyong bagay mula sa Hibernate, malamang na binigyan ka ng proxy sa halip na isang tunay na bagay. At ang proxy object na ito, pagkatapos na idiskonekta mula sa session, ay magtapon ng mga exception kapag tinawag ang mga pamamaraan nito.

Ito ang pinakakaraniwang problema para sa lahat ng mga nagsisimula kapag nagtatrabaho sa Hibernate. Kailangan mong malaman nang eksakto sa anumang naibigay na oras ang sagot sa mga tanong na tulad nito kapag nagtatrabaho ka sa isang Entity object :

  • Mayroon ka bang isang tunay na bagay o isang proxy lamang mula sa isang tunay na bagay?
  • Kasalukuyan ka bang nasa isang transaksyon o hindi?
  • Ito ba ay isang read-write na transaksyon o isang read-only na transaksyon?
  • Ang bagay ba ay pinamamahalaan ng mekanismo ng LazyLoading?
  • Aling mga bahagi ng bagay ang na-load na sa memorya, at aling mga bahagi ang ilo-load kapag na-access?
  • Paano konektado ang iyong bagay sa mga umaasa na bagay?

Ang mabuting balita ay kadalasan ay halata ito. Ngunit kailangan mo pa ring maunawaan kung paano gumagana ang lahat sa ilalim ng hood. Ang deklaratibong programming ay kung ano ito - maaari kang magsulat ng code sa loob ng 10 minuto, maunawaan kung bakit hindi ito gumagana tulad ng nararapat - sa loob ng 10 oras :)

Inalis

At ang huling estado na maaaring magkaroon ng iyong Entity object ay Inalis. Tulad ng malamang na nahulaan mo mula sa pangalan nito, ito ang estado ng isang malayong bagay.

Lumilitaw ang estado na ito dahil sa katotohanan na kung tatanggalin mo ang ilang bagay mula sa database, hindi agad mawawala ang Java object kahit saan.

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