werden bei session.close nicht alle Objekte entfernt, die im Sitzungsbereich persistent waren?
Jigar Joshi
Ja, es wird entfernt, wenn Sie eine Sitzung schließen. Der persistente Status eines Objekts wird in den Status "Getrennt" konvertiert.
Rachel
@ Rachel netter Link mit Code für tieferes Verständnis zur Verfügung gestellt
Priyank Thakkar
Antworten:
161
Eine newInstanz einer persistenten Klasse, die nicht mit a verknüpft ist Session, hat keine Darstellung in der Datenbank und kein Bezeichnerwert wird von Hibernate als vorübergehend angesehen :
Person person =newPerson();
person.setName("Foobar");// person is in a transient state
Eine persistente Instanz hat eine Darstellung in der Datenbank, einen Bezeichnerwert und ist mit a verknüpft Session. Sie können eine vorübergehende Instanz dauerhaft machen, indem Sie sie mit einem verknüpfen Session:
Long id =(Long) session.save(person);// person is now in a persistent state
Wenn wir uns nun closeim Ruhezustand befinden Session, wird die persistente Instanz zu einer getrennten Instanz: Sie ist nicht Sessionmehr an eine Instanz angehängt (kann jedoch später noch geändert und an eine neue Instanz angehängt werden Session).
All dies wird im gesamten Kapitel 10 klar erklärt . Arbeiten mit Objekten der Hibernate-Dokumentation, die ich oben nur umschreibe. Auf jeden Fall ein Muss.
Ein Bezeichnerwert ist wahrscheinlich keine strenge Bedingung für die Beständigkeit eines Objekts, da ich eine Strategie zur Generierung zugeordneter Bezeichner verwenden könnte.
Abhijeet Kashnia
Neben dem Schließen der Sitzung, die die Instanz gelesen hat, kann eine Instanz durch Aufrufen von session.evict () getrennt werden. Dadurch wird verhindert, dass es von Hibernate verwaltet wird (wodurch verhindert wird, dass Änderungen an der Instanz automatisch an die Datenbank zurückgegeben werden). Sie können Änderungen über session.update () an die Datenbank senden und mit session.merge () erneut anhängen.
Mooshu
1
Wir folgen oft nicht den Originaldokumenten, die von Frameworks bereitgestellt werden. Diese haben manchmal selbst versteckte Informationen mit der richtigen Beschreibung, die nur untersucht werden müssen. Das einzige Problem ist, dass wir es nicht leicht finden :)
bis zum
A persistent instance has a representation in the databaseEine persistente Entität hat keine Darstellung in der Datenbank, bevor der Speichervorgang ausgeführt wird.
O.Badr
1
Der Unterschied zwischen getrennten und vorübergehenden Entitäten ist also das Vorhandensein einer ID ? Wenn ich eine neue Instanz mit zugewiesener ID erstelle, ist sie formal vorübergehend, da sie noch nicht beibehalten wird, aber nicht von getrennt getrennt werden kann, da sie eine ID hat. Richtig?
Ruslan Stelmachenko
9
Das Objekt im Ruhezustand hat folgende Zustände:
Transient - Objekte, die mit dem neuen Operator instanziiert wurden, werden als transiente Objekte bezeichnet.
Ein Objekt ist vorübergehend, wenn es gerade mit dem neuen Operator instanziiert wurde und keiner Sitzung im Ruhezustand zugeordnet ist. Es hat keine dauerhafte Darstellung in der Datenbank und es wurde kein Bezeichnerwert zugewiesen. Vorübergehende Instanzen werden vom Garbage Collector zerstört, wenn die Anwendung keine Referenz mehr enthält.
Persistent - Ein Objekt, dem eine Datenbankidentität zugeordnet ist, wird als persistentes Objekt bezeichnet.
Eine persistente Instanz hat eine Darstellung in der Datenbank und einen Bezeichnerwert. Es wurde möglicherweise nur gespeichert oder geladen. Es liegt jedoch per Definition im Rahmen einer Sitzung. Der Ruhezustand erkennt alle Änderungen, die an einem Objekt im dauerhaften Zustand vorgenommen wurden, und synchronisiert den Zustand mit der Datenbank, wenn die Arbeitseinheit abgeschlossen ist.
Getrennt - Eine getrennte Instanz ist ein Objekt, das persistent war, dessen Sitzung jedoch geschlossen wurde.
Eine getrennte Instanz kann zu einem späteren Zeitpunkt erneut an eine neue Sitzung angehängt werden, wodurch sie wieder dauerhaft bleibt. Diese Funktion ermöglicht ein Programmiermodell für lang laufende Arbeitseinheiten, für die eine Bedenkzeit erforderlich ist. Wir nennen sie Anwendungstransaktionen, dh eine Arbeitseinheit aus Sicht des Benutzers.
Lassen Sie mich auch aus Sicht des Garbage Collectors erklären.
Es gibt 3 Objektzustände im Ruhezustand (oder) Objektbereich im Ruhezustand.
Übergangszustand
anhaltender Zustand
losgelöster Zustand
Es ist besser, mit einem Codebeispiel zu verstehen.
Betrachten wir eine POJO-Klasse als Schülerobjekt->
Student student =newStudent();
Dieses Studentenobjekt befindet sich jetzt im Übergangszustand .
Wenn wir dieses POJO-Objekt anhängen, um Sitzung-> in den Ruhezustand zu versetzen
session.save(student);
Jetzt befindet sich dieses POJO-Objekt im dauerhaften Zustand .
(Garbage Collector-Sichtweise - GC kann kein Objekt löschen, das sich im persistenten Zustand befindet. Wir können also sagen, dass der persistente Zustand wie eine temporäre Speicherung für POJO-Objekte ist. )
Wenn wir durchführen->
session.beginTransaction.commit();
Dann befindet sich das POJO-Objekt im permanenten oder Datenbankspeicherstatus
(Garbage Collector-Sichtweise - GC kann dieses Objekt nicht löschen, da dieses POJO-Objekt jetzt außerhalb des Bereichs von JVM liegt und in der Formulartabelle in einer Datenbank gespeichert ist. Wir können also sagen, dass dieser Datenbankspeicherstatus wie ein permanenter Speicher für POJO ist Objekte )
Wenn wir durchführen->
session.evict(student);
Dann wird das POJO-Objekt entfernt oder aus dem persistenten Zustand in den getrennten Zustand zurückversetzt. Dieser Zustand des POJO-Objekts ist also getrennt .
(Garbage Collector-Sichtweise - GC kann das POJO-Objekt mit getrenntem Status leicht aus JVM löschen.)
Die Entität wurde gerade instanziiert und ist keinem Persistenzkontext zugeordnet. Es hat keine dauerhafte Darstellung in der Datenbank und normalerweise wurde kein Bezeichnerwert zugewiesen (es sei denn, der zugewiesene Generator wurde verwendet).
City city =newCity();
verwaltet oder hartnäckig
Der Entität ist eine Kennung zugeordnet und sie ist einem Persistenzkontext zugeordnet. Es kann physisch noch nicht in der Datenbank vorhanden sein.
// 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);
freistehend
Der Entität ist eine Kennung zugeordnet, sie ist jedoch nicht mehr einem Persistenzkontext zugeordnet (normalerweise, weil der Persistenzkontext geschlossen oder die Instanz aus dem Kontext entfernt wurde).
// city is in a detached state, Hibernate is no longer aware of the entity
session.evict(city)
entfernt
Der Entität ist eine Kennung zugeordnet und sie ist einem Persistenzkontext zugeordnet. Die Entfernung aus der Datenbank ist jedoch geplant.
session.remove(city);
Hinweis: Die
Hibernate-API bietet einige Methoden zum Wechseln zwischen Entitätszuständen. Ich denke, es lohnt sich, eine Hibernate-Sitzungsklasse zu untersuchen .
Neben der richtigen Antwort, die bereits als dauerhaft, vorübergehend und getrennt identifiziert wurde, befindet sich nur der Status des Objekts im Ruhezustand.
Genauer gesagt zeigen diese drei Zustände tatsächlich die Objektänderungen im Ruhezustand und den Status des Sitzungslebenszyklus an
Antworten:
Eine
new
Instanz einer persistenten Klasse, die nicht mit a verknüpft istSession
, hat keine Darstellung in der Datenbank und kein Bezeichnerwert wird von Hibernate als vorübergehend angesehen :Eine persistente Instanz hat eine Darstellung in der Datenbank, einen Bezeichnerwert und ist mit a verknüpft
Session
. Sie können eine vorübergehende Instanz dauerhaft machen, indem Sie sie mit einem verknüpfenSession
:Wenn wir uns nun
close
im Ruhezustand befindenSession
, wird die persistente Instanz zu einer getrennten Instanz: Sie ist nichtSession
mehr an eine Instanz angehängt (kann jedoch später noch geändert und an eine neue Instanz angehängt werdenSession
).All dies wird im gesamten Kapitel 10 klar erklärt . Arbeiten mit Objekten der Hibernate-Dokumentation, die ich oben nur umschreibe. Auf jeden Fall ein Muss.
quelle
A persistent instance has a representation in the database
Eine persistente Entität hat keine Darstellung in der Datenbank, bevor der Speichervorgang ausgeführt wird.Das Objekt im Ruhezustand hat folgende Zustände:
Transient - Objekte, die mit dem neuen Operator instanziiert wurden, werden als transiente Objekte bezeichnet.
Ein Objekt ist vorübergehend, wenn es gerade mit dem neuen Operator instanziiert wurde und keiner Sitzung im Ruhezustand zugeordnet ist. Es hat keine dauerhafte Darstellung in der Datenbank und es wurde kein Bezeichnerwert zugewiesen. Vorübergehende Instanzen werden vom Garbage Collector zerstört, wenn die Anwendung keine Referenz mehr enthält.
Persistent - Ein Objekt, dem eine Datenbankidentität zugeordnet ist, wird als persistentes Objekt bezeichnet.
Eine persistente Instanz hat eine Darstellung in der Datenbank und einen Bezeichnerwert. Es wurde möglicherweise nur gespeichert oder geladen. Es liegt jedoch per Definition im Rahmen einer Sitzung. Der Ruhezustand erkennt alle Änderungen, die an einem Objekt im dauerhaften Zustand vorgenommen wurden, und synchronisiert den Zustand mit der Datenbank, wenn die Arbeitseinheit abgeschlossen ist.
Getrennt - Eine getrennte Instanz ist ein Objekt, das persistent war, dessen Sitzung jedoch geschlossen wurde.
Eine getrennte Instanz kann zu einem späteren Zeitpunkt erneut an eine neue Sitzung angehängt werden, wodurch sie wieder dauerhaft bleibt. Diese Funktion ermöglicht ein Programmiermodell für lang laufende Arbeitseinheiten, für die eine Bedenkzeit erforderlich ist. Wir nennen sie Anwendungstransaktionen, dh eine Arbeitseinheit aus Sicht des Benutzers.
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
quelle
Lassen Sie mich auch aus Sicht des Garbage Collectors erklären.
Es gibt 3 Objektzustände im Ruhezustand (oder) Objektbereich im Ruhezustand.
Es ist besser, mit einem Codebeispiel zu verstehen.
Betrachten wir eine POJO-Klasse als Schülerobjekt->
Dieses Studentenobjekt befindet sich jetzt im Übergangszustand .
Wenn wir dieses POJO-Objekt anhängen, um Sitzung-> in den Ruhezustand zu versetzen
Jetzt befindet sich dieses POJO-Objekt im dauerhaften Zustand .
(Garbage Collector-Sichtweise - GC kann kein Objekt löschen, das sich im persistenten Zustand befindet. Wir können also sagen, dass der persistente Zustand wie eine temporäre Speicherung für POJO-Objekte ist. )
Wenn wir durchführen->
Dann befindet sich das POJO-Objekt im permanenten oder Datenbankspeicherstatus
(Garbage Collector-Sichtweise - GC kann dieses Objekt nicht löschen, da dieses POJO-Objekt jetzt außerhalb des Bereichs von JVM liegt und in der Formulartabelle in einer Datenbank gespeichert ist. Wir können also sagen, dass dieser Datenbankspeicherstatus wie ein permanenter Speicher für POJO ist Objekte )
Wenn wir durchführen->
Dann wird das POJO-Objekt entfernt oder aus dem persistenten Zustand in den getrennten Zustand zurückversetzt. Dieser Zustand des POJO-Objekts ist also getrennt .
(Garbage Collector-Sichtweise - GC kann das POJO-Objekt mit getrenntem Status leicht aus JVM löschen.)
quelle
Angesichts der folgenden Entität:
Aus der Dokumentation zu Hibernate 5.2 (ich habe auch den
removed
Status angegeben):Hinweis: Die Hibernate-API bietet einige Methoden zum Wechseln zwischen Entitätszuständen. Ich denke, es lohnt sich, eine Hibernate-Sitzungsklasse zu untersuchen .
quelle
Neben der richtigen Antwort, die bereits als dauerhaft, vorübergehend und getrennt identifiziert wurde, befindet sich nur der Status des Objekts im Ruhezustand.
Genauer gesagt zeigen diese drei Zustände tatsächlich die Objektänderungen im Ruhezustand und den Status des Sitzungslebenszyklus an
quelle