Az államok listája

És most kezdődik a móka. Tanulmányozzuk az entitás objektumok állapotait. Mindenért fizetni kell, és a Hibernate használatáért is. Nem gondolod, hogy a HQL tanulása ekkora ár? Nem, az élet egy kicsit bonyolultabb.

Ha van valamilyen Entity objektum, amelyet a hibernálással menthet az adatbázisba, akkor a hibernált állapot szempontjából ennek az objektumnak négy állapota lehet:

  • Átmeneti
  • Állandó (vagy menedzselt)
  • Különálló
  • Eltávolítva

És hogy érdekeljen, ezt a képet csatolom ehhez az előadáshoz:

Átmeneti

Valójában minden sokkal egyszerűbb, mint amilyennek látszik, bár nem árnyalatok nélkül. Például minden olyan entitásobjektum, amelyet kifejezetten Java kóddal hozott létre, és nem töltött be az adatbázisból a hibernálással, átmeneti (átlátszó) állapotú.

EmployeeEntity employee = new EmployeeEntity();

Az Átmeneti állapot azt jelenti, hogy a Hibernate-nak fogalma sincs erről az objektumról, és az objektumon végzett műveletek sem érintik a hibernálást, sem a Hibernate ezen az objektumon végzett munkája.

Az ilyen objektumokat POJO - Plain Old Java Object - nek is nevezik . A kifejezést gyakran használják a különféle trükkös viselkedésű objektumok ellentéteként. Emlékszel a Moc-objektumokra, amelyeket Mockito készített? Itt nem POJO.

Ha néhány klienskód egy Tranziens állapotú objektummal működik, akkor interakciójuk egy rendkívül egyszerű sémával írható le:

Állandó vagy menedzselt

A következő leggyakoribb eset a Hibernate motorral kapcsolatos objektumok. Állapotuk neve Persistent (vagy menedzselt). Pontosan két módja van egy ilyen állapotú objektum megszerzésének:

  • Objektum betöltése hibernált állapotból.
  • Objektum mentése hibernált állapotba.

Példák:

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

Egy ilyen objektum általában valamilyen rekordnak felel meg az adatbázisban, van azonosítója és hasonlók. Ez az objektum a hibernált munkamenethez van csatolva, és általában nem valódi objektummal, hanem valamilyen proxyval ábrázolható.

Elképzelhető, hogy a session.load() metódus meghívása után visszakapunk valamilyen csonkobjektumot (proxy), és az adatbázis minden hívása csak az objektum metódusainak meghívása után fog megtörténni. De ezekről a részletekről egy kicsit később fogunk beszélni.

Az ügyfélkód és a Kezelt állapotú objektum közötti interakció pedig a következő képpel írható le:

Különálló

A következő állapot az, amikor az objektumot leválasztották a munkamenetről. Ez azt jelenti, hogy miután az objektumot csatolták a hibernált munkamenethez, de a munkamenetet lezárták vagy a tranzakció befejeződött, és a Hibernate már nem figyeli ezt az objektumot.

Példa:

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

Az első példában a munkamenet lezárult. A második esetben kifejezetten jeleztük, hogy le akarjuk választani az objektumot a munkamenetről az evict() metódussal .

Az új kód-objektum interakciós séma így fog kinézni:

És itt válik érdekessé. Ha az objektumát a Hibernate szolgáltatásból szerezték be, akkor valószínűleg egy proxyt kapott valódi objektum helyett. És ez a proxy objektum a munkamenetről való leválasztás után kivételeket dob ​​a metódusai meghívásakor.

Ez a leggyakoribb probléma minden kezdő számára, amikor a Hibernate funkcióval dolgozik. Amikor entitásobjektummal dolgozik, bármikor pontosan tudnia kell a választ az ehhez hasonló kérdésekre :

  • Valódi tárgya van, vagy csak egy valódi objektum proxyja?
  • Jelenleg tranzakcióban van vagy nem?
  • Írás-olvasási tranzakcióról van szó, vagy csak olvasható tranzakcióról?
  • Az objektumot a LazyLoading mechanizmus kezeli?
  • Az objektum mely részei vannak már betöltve a memóriába, és mely részek kerülnek betöltésre a hozzáféréskor?
  • Hogyan kapcsolódik az objektum a függő objektumokhoz?

A jó hír az, hogy ez legtöbbször nyilvánvaló. De még mindig meg kell értened, hogyan működik mindez a motorháztető alatt. A deklaratív programozás az, ami - 10 perc alatt írhatsz kódot, megérted, miért nem működik úgy, ahogy kellene - 10 óra alatt :)

Eltávolítva

És az Entity objektum utolsó állapota Eltávolítva. Ahogy valószínűleg már a nevéből is kitalálta, ez egy távoli objektum állapota.

Ez az állapot annak köszönhető, hogy ha töröl egy objektumot az adatbázisból, akkor a Java objektum nem tűnik el azonnal sehol.

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