Co to są odłączone, trwałe i przejściowe obiekty w stanie hibernacji? Proszę wyjaśnić na przykładzie.
Co to są odłączone, trwałe i przejściowe obiekty w stanie hibernacji? Proszę wyjaśnić na przykładzie.
Odpowiedzi:
new
Wystą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 close
z 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.
A persistent instance has a representation in the database
Trwała jednostka nie ma reprezentacji w bazie danych przed wykonaniem operacji składowania.
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
Pozwólcie, że wyjaśnię również z punktu widzenia garbage collectora.
Istnieją 3 stany obiektów hibernacji (lub).
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)
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ż removed
stan):
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 .
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