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
GO TO FULL VERSION