Co to są odłączone, trwałe i przejściowe obiekty w stanie hibernacji?

100

Co to są odłączone, trwałe i przejściowe obiekty w stanie hibernacji? Proszę wyjaśnić na przykładzie.

Jigar Joshi
źródło
po sesji.close czy nie usunie wszystkich obiektów, które były trwałe w zakresie sesji?
Jigar Joshi
Tak, zostanie usunięty, więc za każdym razem, gdy zamkniesz sesję, stan trwały obiektu jest konwertowany na stan odłączony.
Rachel
@Rachel ładny link z kodem do głębszego zrozumienia
Priyank Thakkar

Odpowiedzi:

161

newWystąpienie trwałego klasy, które nie jest związane z Session, nie ma reprezentacji w bazie danych, a nie wartość identyfikatora jest uważany przemijający przez Hibernate:

Person person = new Person();
person.setName("Foobar");
// person is in a transient state

Trwałe przykład ma reprezentacji w bazie danych, co stanowi wartość identyfikatora i wiąże się z Session. Możesz uczynić przejściową instancję trwałą , kojarząc ją z Session:

Long id = (Long) session.save(person);
// person is now in a persistent state

Teraz, jeśli korzystamy closez Hibernacji Session, instancja stała stanie się instancją odłączoną : nie jest już dołączona do innej Session(ale nadal można ją później zmodyfikować i ponownie podłączyć do nowej Session).

Wszystko to jest jasno wyjaśnione w całym rozdziale 10. Praca z obiektami dokumentacji Hibernate, które parafrazuję powyżej. Zdecydowanie pozycja obowiązkowa.

Pascal Thivent
źródło
Wartość identyfikatora prawdopodobnie nie jest ścisłym warunkiem, aby obiekt był trwały, ponieważ mógłbym użyć strategii generowania przypisanego identyfikatora.
Abhijeet Kashnia
Oprócz zamknięcia sesji, która odczytuje w instancji, można odłączyć instancję, wywołując session.evict (). Uniemożliwia to zarządzanie nim przez Hibernate (w ten sposób zapobiega automatycznej propagacji zmian w instancji z powrotem do bazy danych). Możesz wysłać zmiany do bazy danych poprzez session.update () i ponownie dołączyć ją za pomocą session.merge ().
Mooshu
1
Wiele razy nie śledzimy oryginalnych dokumentów dostarczonych przez frameworki ... które czasem same w sobie zawierają ukryte informacje z odpowiednim opisem, które wystarczy zbadać. Jedynym problemem jest to, że nie znajdziemy go łatwo :)
agpt
A persistent instance has a representation in the databaseTrwała jednostka nie ma reprezentacji w bazie danych przed wykonaniem operacji składowania.
O.Badr
1
A zatem, oderwana i przejściowa różnica między bytem to obecność ID ? Jeśli utworzę nową instancję z przypisanym identyfikatorem, to formalnie jest przejściowa, ponieważ nie jest jeszcze utrwalona, ​​ale nie można jej odróżnić od odłączonej, ponieważ ma identyfikator. Dobrze?
Ruslan Stelmachenko
9

Obiekt w stanie hibernacji ma następujące stany:

Przejściowe - obiekty utworzone przy użyciu nowego operatora nazywane są obiektami przejściowymi.

Obiekt jest przejściowy, jeśli został właśnie utworzony przy użyciu nowego operatora i nie jest powiązany z sesją hibernacji. Nie ma trwałej reprezentacji w bazie danych i nie została przypisana żadna wartość identyfikatora. Instancje przejściowe zostaną zniszczone przez moduł wyrzucania elementów bezużytecznych, jeśli aplikacja nie zawiera już odwołania.

Trwały - obiekt, który ma skojarzoną z nim tożsamość bazy danych, nazywany jest obiektem trwałym.

Trwała instancja ma reprezentację w bazie danych i wartość identyfikatora. Mógł po prostu zostać zapisany lub załadowany; jednakże z definicji jest to objęte zakresem Sesji. Hibernacja wykryje wszelkie zmiany wprowadzone w obiekcie w stanie trwałym i zsynchronizuje stan z bazą danych po zakończeniu jednostki pracy.

Odłączona - odłączona instancja to obiekt, który był trwały, ale jego sesja została zamknięta.

Odłączoną instancję można ponownie dołączyć do nowej sesji w późniejszym czasie, dzięki czemu jest ona ponownie trwała. Ta funkcja umożliwia model programowania dla długotrwałych jednostek pracy, które wymagają czasu na przemyślenie przez użytkownika. Nazywamy je transakcjami aplikacyjnymi, czyli jednostką pracy z punktu widzenia użytkownika.

http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012

Sk Sharma
źródło
5

Pozwólcie, że wyjaśnię również z punktu widzenia garbage collectora.

Istnieją 3 stany obiektów hibernacji (lub).

  1. Stan przejściowy
  2. stan trwały
  3. stan odłączony

Lepiej jest zrozumieć przykład kodu-

Rozważmy klasę POJO jako Student Object->

Student student = new Student(); 

Teraz ten obiekt studenta jest w stanie przejściowym .


Kiedy dołączamy ten obiekt POJO do hibernacji sesji->

session.save(student);

Teraz ten obiekt POJO jest w stanie trwałym .

(Punkt widzenia garbage collectora - GC nie może wymazać żadnego obiektu, który jest w stanie trwałym. Tak więc możemy powiedzieć, że stan trwały jest jak tymczasowe przechowywanie obiektów POJO )


Jeśli wykonamy->

session.beginTransaction.commit();

wtedy obiekt POJO jest w stanie przechowywania trwałego lub bazy danych

(Punkt widzenia garbage collectora - GC nie może wymazać tego obiektu, ponieważ ten obiekt POJO znajduje się teraz poza zakresem JVM i jest przechowywany w tabeli formularza wewnątrz bazy danych. Więc możemy powiedzieć, że ten stan przechowywania bazy danych jest jak trwała pamięć dla POJO obiekty )


Jeśli wykonamy->

session.evict(student); 

następnie obiekt POJO jest eksmitowany lub usuwany ze stanu trwałego do stanu odłączonego. W takim razie ten stan obiektu POJO jest odłączony .

(Punkt widzenia garbage collectora - GC może łatwo usunąć obiekt POJO stanu odłączonego z JVM)

Sabunkar Tejas Sahailesh
źródło
2

Biorąc pod uwagę następujący podmiot:

@Entity
public class City {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)    
    private long id;

    // other fields and methods.
}

Z dokumentacji Hibernate 5.2 (dodałem również removedstan):

przejściowy

jednostka została właśnie utworzona i nie jest skojarzona z kontekstem trwałości. Nie ma trwałej reprezentacji w bazie danych i zazwyczaj nie została przypisana żadna wartość identyfikatora (chyba że użyto przypisanego generatora).

City city = new City();

zarządzany lub trwały

jednostka ma powiązany identyfikator i jest powiązana z kontekstem trwałości. Może fizycznie istnieć w bazie danych, ale nie musi.

// city will be in a managed/persistent state and any changes to it, will be tracked by hibernate
// and reflected to the database when the persistence context is flushed.
session.save(city);

oderwany

jednostka ma powiązany identyfikator, ale nie jest już powiązana z kontekstem trwałości (zwykle dlatego, że kontekst trwałości został zamknięty lub instancja została usunięta z kontekstu)

// city is in a detached state, Hibernate is no longer aware of the entity 
session.evict(city)

oddalony

jednostka ma powiązany identyfikator i jest powiązana z kontekstem trwałości, jednak jest zaplanowana do usunięcia z bazy danych.

session.remove(city);


Uwaga: Hibernate API oferuje parę metod przełączania między stanami encji i myślę, że warto zbadać klasę Hibernate Session .

O.Badr
źródło
0

Oprócz prawidłowej odpowiedzi już zidentyfikowanej trwałe, przemijające, odłączone to tylko stan obiektu w stanie hibernacji.

Mówiąc dokładniej, te trzy stany w rzeczywistości pokazują zmiany obiektu hibernacji i stan cyklu życia sesji

Amol Dixit
źródło