Możliwe opcje statusu obiektu

Jak być może zauważyłeś, kiedy obiekt jest dołączony do Hibernate, jego stan nazywa się Persistent lub Managed . Jak dobrze? Trwałe czy zarządzane?

Jest to możliwe i tak, i tak. Zgodnie ze specyfikacją JPA obiekt ma stan Persist, a zgodnie ze specyfikacją Hibernate jego stan nazywa się Managed.

W Hibernate praca z bazą danych odbywa się poprzez obiekt typu org.hibernate.Session . Według JPA klasa powinna nazywać się javax.persistence.EntityManager. To naprawdę nie jest duży problem, ponieważ oba typy są interfejsami.

Interfejs org.hibernate.Session jest zadeklarowany w następujący sposób:

interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager,    QueryProducer, java.io.Serializable, SharedSessionContract {

}

Dlatego interfejs Session ma wszystkie metody, które znajdują się w interfejsie EntityManager . Ale ma też swoje własne, które odziedziczył po wcześniejszych wersjach Hibernate, kiedy nie było jeszcze specyfikacji JPA.

Cała ta sytuacja jest opisana w następujący sposób:

Przyjrzyjmy się wszystkim metodom, które posiada interfejs sesji, a także niuansom ich pracy.

Niuanse metody perpetu().

Podczas zapisywania obiektu do bazy danych należy pamiętać o dwóch rzeczach.

Po pierwsze, zapisanie obiektu docelowo spowoduje wykonanie jednego z poleceń SQL: INSERT lub UPDATE. Po drugie, akcje te nie wystąpią natychmiast po wywołaniu metody obiektusesja, ale dopiero po zamknięciu transakcji.

Rozważmy prostą sytuację, na przykład masz klasę User :

@Entity
public class User {
	@Id
	@GeneratedValue
    public Integer id;

	@Columnt(name=”user_name”)
    public String name;
}

Zapiszmy jego obiekt w bazie danych za pomocą metodypersist () .

User user = new User();
user.setName("Kolyan");
session.persist(user);

Celem tej metody jest zapisanie nowego obiektu do bazy danych. Jeśli takiego obiektu jeszcze nie ma, to zostanie on dodany do bazy przez wywołanie metody SQL INSERT .

Jeśli obiekt jest już w bazie danych, to nic się nie stanie. Możliwy jest jednak również trzeci przypadek - próba zapisania obiektu ze statusem Odłączony do bazy danych. W takim przypadku zostanie zgłoszony wyjątek. Przykład:

User user = new User();
user.setName("Kolyan");
session.persist(user);

session.evict(user);     // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!

Niuanse metody save().

Metoda save() została odziedziczona przez obecną wersję Hibernate z poprzednich wersji. Zasadniczo jest bardzo podobny do metody perpetu() , dodaje również nowy rekord do tabeli za pomocą metody INSERT. Ma jednak kilka interesujących niuansów.

Po pierwsze, ta metoda zwraca wartość - nowy identyfikator obiektu . Jak już wiesz, obiekty zwykle nie mają identyfikatora przed dodaniem do bazy danych i jest on już przypisany przez bazę danych. Tak więc metoda save() obiektu sesji zwraca identyfikator, który został przypisany do składowanego obiektu.

Ważny! Zgodnie ze specyfikacją Hibernate ID może to być dowolny obiekt nadający się do serializacji, a nie tylko liczba. Może to być ciąg znaków, liczba, wyliczenie, cokolwiek, co można w całości umieścić w jednej kolumnie tabeli w bazie danych.

Metoda save() ma typ wyniku Serialized, więc jej wynik musi być rzutowany na poprawny typ:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

Ponadto metoda save() zachowuje się inaczej w przypadku obiektu w stanie Detached. Uznaje taki obiekt za nowy i po prostu dodaje kolejny wpis:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

session.evict(user); 	// detach the object from the session
Integer id2 = (Integer) session.save(user);

Zmienne id i id2 będą różne. Do tabeli w bazie danych zostaną dodane dwa rekordy, po jednym dla każdej operacji save() .