Mögliche Objektstatusoptionen

Wie Sie vielleicht bemerkt haben, wird ein Objekt, wenn es an den Ruhezustand angehängt ist, als „Persistent “ oder „Managed“ bezeichnet . Wie richtig? Beharren oder verwaltet?

Es ist möglich und so und so. Gemäß der JPA-Spezifikation hat ein Objekt einen Persist-Status und gemäß der Hibernate-Spezifikation wird sein Status als „Managed“ bezeichnet.

In Hibernate erfolgt die Arbeit mit der Datenbank über ein Objekt vom Typ org.hibernate.Session . Laut JPA sollte die Klasse javax.persistence.EntityManager heißen. Das ist eigentlich kein großes Problem, da es sich bei beiden Typen um Schnittstellen handelt.

Die Schnittstelle org.hibernate.Session wird wie folgt deklariert:

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

}

Daher verfügt die Session- Schnittstelle über alle Methoden, die in der EntityManager- Schnittstelle enthalten sind . Aber es verfügt auch über eine eigene, die es von früheren Versionen von Hibernate geerbt hat, als es noch keine JPA-Spezifikation gab.

Diese ganze Situation wird wie folgt beschrieben:

Werfen wir einen Blick auf alle Methoden der Sitzungsschnittstelle sowie auf die Nuancen ihrer Arbeit.

Die Nuancen der persist()-Methode

Wenn Sie ein Objekt in der Datenbank speichern, müssen Sie zwei Dinge beachten.

Erstens führt das Speichern des Objekts schließlich zur Ausführung eines der SQL-Befehle: INSERT oder UPDATE. Zweitens werden diese Aktionen nicht unmittelbar nach dem Aufruf der Methode des Objekts ausgeführtSitzung, aber erst nach Abschluss der Transaktion.

Betrachten wir eine einfache Situation, zum Beispiel haben Sie eine User- Klasse :

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

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

Speichern wir sein Objekt mit der Methode persist() in der Datenbank .

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

Der Zweck dieser Methode besteht darin, ein neues Objekt in der Datenbank zu speichern. Wenn noch kein solches Objekt vorhanden ist, wird es durch Aufruf der INSERT SQL-Methode zur Datenbank hinzugefügt .

Befindet sich das Objekt bereits in der Datenbank, passiert nichts. Es ist jedoch auch ein dritter Fall möglich – ein Versuch, ein Objekt mit dem Status „Getrennt“ in der Datenbank zu speichern. In diesem Fall wird eine Ausnahme ausgelöst. Beispiel:

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!

Die Nuancen der save()-Methode

Die Methode save() wurde vom aktuellen Hibernate aus seinen Vorgängerversionen geerbt. Im Kern ist es der Methode persist() sehr ähnlich , außerdem fügt es mithilfe der Methode INSERT einen neuen Datensatz zur Tabelle hinzu. Es weist jedoch einige interessante Nuancen auf.

Zunächst gibt diese Methode einen Wert zurück – die neue ID des Objekts . Wie Sie bereits wissen, haben Objekte vor dem Hinzufügen zur Datenbank normalerweise keine ID und diese ist bereits von der Datenbank zugewiesen. Die Methode save() des Sitzungsobjekts gibt also die ID zurück, die dem gespeicherten Objekt zugewiesen wurde.

Wichtig! Gemäß der Hibernate-ID-Spezifikation kann es sich um ein beliebiges serialisierbares Objekt handeln, nicht nur um eine Zahl. Es kann sich um eine Zeichenfolge, eine Zahl, eine Aufzählung oder alles andere im Allgemeinen handeln, das vollständig in eine Spalte einer Tabelle in der Datenbank eingefügt werden kann.

Die Methode save() hat einen Ergebnistyp „Serialisiert“, daher muss ihr Ergebnis in den richtigen Typ umgewandelt werden:

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

Außerdem verhält sich die Methode save() anders, wenn sich das Objekt im Status „Getrennt“ befindet. Es betrachtet ein solches Objekt als neu und fügt einfach einen weiteren Eintrag hinzu:

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);

Die Variablen id und id2 werden unterschiedlich sein. Der Tabelle in der Datenbank werden zwei Datensätze hinzugefügt, einer für jeden save()- Vorgang .