Was sind getrennte, persistente und vorübergehende Objekte im Ruhezustand?

100

Was sind getrennte, persistente und vorübergehende Objekte im Ruhezustand? Bitte erläutern Sie dies anhand eines Beispiels.

Jigar Joshi
quelle
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 = 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 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.

Pascal Thivent
quelle
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.

http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012

Sk Sharma
quelle
5

Lassen Sie mich auch aus Sicht des Garbage Collectors erklären.

Es gibt 3 Objektzustände im Ruhezustand (oder) Objektbereich im Ruhezustand.

  1. Übergangszustand
  2. anhaltender Zustand
  3. losgelöster Zustand

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

Sabunkar Tejas Sahailesh
quelle
2

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 removedStatus 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 .

O.Badr
quelle
0

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

Amol Dixit
quelle