Mik az entitások állapotai a Hibernate-ben?
sobes.tech MI
Válasz az MI-től
A Hibernate-ben egy entitás az alábbi állapotok egyikében lehet:
-
Átmeneti (Transient): A objektum létre lett hozva, de nincs hozzárendelve Hibernate munkamenethez. Nincs reprezentációja az adatbázisban. A rajta végzett műveletek memóriában történnek, de nem befolyásolják az adatbázist.
// A Student entitás létrehozva, de nincs hozzárendelve munkamenethez Student student = new Student("Ivan", "Ivanov"); -
Állandó (Persistent): Az objektum a jelenlegi Hibernate munkamenethez van társítva, és az által kezelt. Bármilyen változtatás az objektumon szinkronizálódik az adatbázissal a tranzakció commitja vagy a munkamenet flush-e során. Egy, a munkamenet segítségével az adatbázisból olvasott objektum ebben az állapotban van.
// A Student entitás az adatbázisból lett lekérve vagy ott tárolva Session session = sessionFactory.openSession(); session.beginTransaction(); Student student = new Student("Petr", "Petrov"); session.save(student); // a student most Persistent állapotban van // Vagy // Student student = session.get(Student.class, 1L); // a student Persistent állapotban van session.getTransaction().commit(); session.close(); -
Leválasztott (Detached): Az objektum korábban társítva volt egy munkamenethez, de a munkamenet bezárult vagy az objektumot kifejezetten leválasztották (pl.
session.evict(object)segítségével). Az objektum még mindig tartalmaz adatokat az adatbázisból, de a rajta végzett változtatások nem szinkronizálódnak automatikusan az adatbázissal. A változtatások mentéséhez az objektumot újra társítani kell egy másik munkamenethez.Session session1 = sessionFactory.openSession(); session1.beginTransaction(); Student student = session1.get(Student.class, 1L); // Persistent session1.getTransaction().commit(); session1.close(); // a student most Leválasztott állapotban van // A leválasztott állapotban lévő objektum módosítása nem befolyásolja az adatbázist student.setName("New Name"); // A változtatások mentéséhez új munkamenethez kell társítani Session session2 = sessionFactory.openSession(); session2.beginTransaction(); session2.update(student); // a student újra Persistent lesz session2.getTransaction().commit(); session2.close();
Állapotok közötti átmenetek:
| Az állapotból\Az állapotba | Transient | Persistent | Detached |
|---|---|---|---|
| Transient | (marad) | save(), persist(), saveOrUpdate() |
(nem közvetlenül lehetséges) |
| Persistent | (lehetetlen) | (marad) | close(), evict(), clear() |
| Detached | (lehetetlen) | update(), merge(), saveOrUpdate() |
(marad) |