Aké sú stavy entít v Hibernate?
sobes.tech AI
Odpoveď od AI
V Hibernate entita môže byť v jednom z nasledujúcich stavov:
-
Transient (Prechodný): Objekt je vytvorený, ale nie je spojený s Hibernate session. Nemá žiadne zobrazenie v databáze. Operácie s ním sa vykonávajú v pamäti, ale neovplyvňujú databázu.
// Entita Student je vytvorená, ale nie je priradená k session Student student = new Student("Ivan", "Ivanov"); -
Persistent (Stále): Objekt je spojený s aktuálnou Hibernate session a je ňou spravovaný. Akékoľvek zmeny objektu budú synchronizované s databázou pri potvrdení transakcie alebo vyprázdnení (flush) session. Objekt načítaný z databázy pomocou session je v tomto stave.
// Entita Student je načítaná z databázy alebo uložená v nej Session session = sessionFactory.openSession(); session.beginTransaction(); Student student = new Student("Petr", "Petrov"); session.save(student); // student je teraz v Persistent stave // Alebo // Student student = session.get(Student.class, 1L); // student je v Persistent stave session.getTransaction().commit(); session.close(); -
Detached (Odpojené): Objekt bol skôr spojený so session, ale session bola zatvorená alebo bol objekt výslovne odpojený (napríklad pomocou
session.evict(object)). Objekt stále obsahuje údaje z databázy, ale zmeny v ňom vykonané nebudú automaticky synchronizované s databázou. Aby bolo možné zmeny uložiť, je potrebné objekt znova pripojiť k inej session.Session session1 = sessionFactory.openSession(); session1.beginTransaction(); Student student = session1.get(Student.class, 1L); // Persistent session1.getTransaction().commit(); session1.close(); // student je teraz v Detached stave // Zmena objektu v Detached stave neovplyvní databázu student.setName("Nové meno"); // Na uloženie zmien je potrebné ho pripojiť k novej session Session session2 = sessionFactory.openSession(); session2.beginTransaction(); session2.update(student); // student je znova v Persistent stave session2.getTransaction().commit(); session2.close();
Prechody medzi stavmi:
| Z stavu\Do stavu | Transient | Persistent | Detached |
|---|---|---|---|
| Transient | (zostáva) | save(), persist(), saveOrUpdate() |
(nepoužiteľné priamo) |
| Persistent | (nepoužiteľné) | (zostáva) | close(), evict(), clear() |
| Detached | (nepoužiteľné) | update(), merge(), saveOrUpdate() |
(zostáva) |