Sobes.tech
Middle

Kādi ir entitāšu stāvokļi Hibernate?

sobes.tech AI

Atbilde no AI

Hibernate entitāte var atrasties vienā no šādām stāvokļiem:

  • Transient (Pagaidu): Objekts ir izveidots, bet nav saistīts ar Hibernate sesiju. Tam nav attēlojuma datu bāzē. Operācijas ar to tiek veiktas atmiņā, bet neietekmē datu bāzi.

    // Student entītija ir izveidota, bet nav piesaistīta sesijai
    Student student = new Student("Ivan", "Ivanov");
    
  • Persistent (Pastāvīgs): Objekts ir saistīts ar pašreizējo Hibernate sesiju un to pārvalda. Jebkādas izmaiņas objektā tiks sinhronizētas ar datu bāzi, apstiprinot transakciju vai iztukšojot (flush) sesiju. Objekts, kas ielādēts no datu bāzes ar sesijas palīdzību, ir šajā stāvoklī.

    // Student entītija ir iegūta no datu bāzes vai saglabāta tajā
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    
    Student student = new Student("Petr", "Petrov");
    session.save(student); // student tagad ir Pastāvīgs
    
    // Vai
    // Student student = session.get(Student.class, 1L); // student ir Pastāvīgs
    
    session.getTransaction().commit();
    session.close();
    
  • Detached (Atvienots): Objekts agrāk bija saistīts ar sesiju, bet sesija tika aizvērta vai objekts tika skaidri atvienots (piemēram, ar session.evict(object)). Objekts joprojām satur datus no datu bāzes, bet izmaiņas tajā netiks automātiski sinhronizētas ar datu bāzi. Lai saglabātu izmaiņas, objektu jāpievieno vēlreiz citai sesijai.

    Session session1 = sessionFactory.openSession();
    session1.beginTransaction();
    
    Student student = session1.get(Student.class, 1L); // Pastāvīgs
    session1.getTransaction().commit();
    session1.close(); // student tagad ir Atvienots
    
    // Izmaiņas objektā Atvienotā stāvoklī neietekmēs datu bāzi
    student.setName("Jauns vārds"); 
    
    // Lai saglabātu izmaiņas, to jāpievieno jaunai sesijai
    Session session2 = sessionFactory.openSession();
    session2.beginTransaction();
    session2.update(student); // student atkal kļūst par Pastāvīgu
    session2.getTransaction().commit();
    session2.close();
    

Pārejas starp stāvokļiem:

No stāvokļa\Uz stāvokli Transient Persistent Detached
Transient (paliek) save(), persist(), saveOrUpdate() (tieši nav iespējams)
Persistent (nav iespējams) (paliek) close(), evict(), clear()
Detached (nav iespējams) update(), merge(), saveOrUpdate() (paliek)