Was sind getrennte, persistente und vorübergehende Objekte im Ruhezustand? Bitte erläutern Sie dies anhand eines Beispiels.
Was sind getrennte, persistente und vorübergehende Objekte im Ruhezustand? Bitte erläutern Sie dies anhand eines Beispiels.
Antworten:
Eine new
Instanz 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 = new Person();
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 close
im Ruhezustand befinden Session
, wird die persistente Instanz zu einer getrennten Instanz: Sie ist nicht Session
mehr 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.
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
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->
Student student = new Student();
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.)
Angesichts der folgenden Entität:
@Entity
public class City {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
// other fields and methods.
}
Aus der Dokumentation zu Hibernate 5.2 (ich habe auch den removed
Status angegeben):
vorübergehend
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 = new City();
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