Cosa sono gli oggetti distaccati, persistenti e transitori in ibernazione?


100

Cosa sono gli oggetti distaccati, persistenti e transitori in ibernazione? Si prega di spiegare con un esempio.


su session.close non rimuoverà tutti gli oggetti che erano persistenza nell'ambito della sessione?
Jigar Joshi

Sì, verrà rimosso, quindi ogni volta che si chiude una sessione lo stato persistente di un oggetto viene convertito in stato Scollegato.
Rachel

@Rachel bel link fornito con codice per una comprensione più profonda
Priyank Thakkar

Risposte:


161

Un newesempio di una classe persistente che non è associato a una Session, non ha rappresentanza nel database e nessun valore identificativo è considerato transitorio da Hibernate:

Person person = new Person();
person.setName("Foobar");
// person is in a transient state

Un persistente istanza ha una rappresentazione nel database, un valore identificativo ed è associata con una Session. È possibile rendere persistente un'istanza temporanea associandola a Session:

Long id = (Long) session.save(person);
// person is now in a persistent state

Ora, se utilizziamo closeHibernate Session, l'istanza persistente diventerà un'istanza distaccata : non è più attaccata a Session(ma può comunque essere modificata e ricollegata a una nuova in Sessionseguito).

Tutto questo è spiegato chiaramente in tutto il Capitolo 10. Lavorare con oggetti della documentazione di Hibernate che sto solo parafrasando sopra. Sicuramente, una lettura obbligata.


Un valore identificativo probabilmente non è una condizione rigorosa affinché un oggetto sia persistente poiché potrei usare la strategia di generazione dell'identificatore assegnato.
Abhijeet Kashnia,

Oltre a chiudere la sessione che ha letto nell'istanza, è possibile scollegare un'istanza chiamando session.evict (). Ciò ne impedisce la gestione da parte di Hibernate (quindi evita che le modifiche all'istanza vengano propagate automaticamente al database). È possibile inviare modifiche al database tramite session.update () e ricollegarlo con session.merge ().
Mooshu

1
Molte volte non seguiamo i documenti originali forniti dai framework .. che a volte contengono informazioni nascoste con una descrizione adeguata che devono solo essere esplorate. l'unico problema è che non lo troviamo facilmente :)
agpt

A persistent instance has a representation in the databaseUn'entità persistente non ha una rappresentazione nel database prima di eseguire il commit dell'operazione di salvataggio.
O.Badr

1
Quindi, la differenza di entità distaccata e transitoria è la presenza dell'ID ? Se creo una nuova istanza con ID assegnato, formalmente è transitoria, perché non è ancora persistente, ma non può essere distinguibile da scollegata, perché ha un ID. Destra?
Ruslan Stelmachenko

9

L'oggetto in ibernazione ha i seguenti stati:

Transitori: gli oggetti istanziati utilizzando il nuovo operatore sono chiamati oggetti transitori.

Un oggetto è transitorio se è stato appena istanziato utilizzando l'operatore new e non è associato a una sessione di ibernazione. Non ha una rappresentazione persistente nel database e non è stato assegnato alcun valore identificativo. Le istanze transitorie verranno eliminate dal Garbage Collector se l'applicazione non contiene più un riferimento.

Persistente: un oggetto a cui è associata un'identità di database è chiamato oggetto persistente.

Un'istanza persistente ha una rappresentazione nel database e un valore identificativo. Potrebbe essere stato semplicemente salvato o caricato; tuttavia, è per definizione nell'ambito di una sessione. Hibernate rileverà tutte le modifiche apportate a un oggetto in stato persistente e sincronizzerà lo stato con il database al termine dell'unità di lavoro.

Detached: un'istanza scollegata è un oggetto che è stato persistente, ma la sua sessione è stata chiusa.

Un'istanza scollegata può essere ricollegata a una nuova sessione in un secondo momento, rendendola nuovamente persistente. Questa funzione abilita un modello di programmazione per unità di lavoro di lunga durata che richiedono tempo di riflessione da parte dell'utente. Li chiamiamo transazioni applicative, cioè un'unità di lavoro dal punto di vista dell'utente.

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


5

Lasciatemi spiegare anche dal punto di vista del Garbage Collector.

Ci sono 3 stati oggetto di ibernazione (o) Ambito oggetto di ibernazione-

  1. Stato transitorio
  2. stato persistente
  3. stato distaccato

È meglio capire con un esempio di codice-

Consideriamo una classe POJO come Student Object->

Student student = new Student(); 

Ora, questo oggetto studente è in uno stato transitorio .


Quando attacchiamo questo oggetto POJO per ibernare la sessione->

session.save(student);

Ora questo oggetto POJO è in uno stato persistente .

(Punto di vista del garbage collector: GC non può cancellare qualsiasi oggetto che si trova nello stato persistente. Quindi possiamo dire che lo stato persistente è come l'archiviazione temporanea per oggetti POJO )


Se eseguiamo->

session.beginTransaction.commit();

quindi l'oggetto POJO è nello stato di archiviazione permanente o database

(Punto di vista del Garbage Collector: GC non può cancellare questo oggetto perché questo oggetto POJO è ora al di fuori dell'ambito di JVM e memorizzato nella tabella del modulo all'interno di un database Quindi possiamo dire che questo stato di archiviazione del database è come l'archiviazione permanente per POJO oggetti )


Se eseguiamo->

session.evict(student); 

quindi l'oggetto POJO viene espulso o rimosso dallo stato persistente allo stato disconnesso, quindi questo stato dell'oggetto POJO è stato scollegato .

(Punto di vista del garbage collector: GC può facilmente cancellare l'oggetto POJO a stato scollegato da JVM)


2

Data la seguente entità:

@Entity
public class City {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)    
    private long id;

    // other fields and methods.
}

Dalla documentazione di Hibernate 5.2 (ho incluso anche lo removedstato):

transitorio

l'entità è stata appena istanziata e non è associata a un contesto di persistenza. Non ha una rappresentazione persistente nel database e in genere non è stato assegnato alcun valore identificativo (a meno che non sia stato utilizzato il generatore assegnato).

City city = new City();

gestito o persistente

l'entità ha un identificatore associato ed è associata a un contesto di persistenza. Può o non può ancora esistere fisicamente nel database.

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

distaccato

l'entità ha un identificatore associato, ma non è più associata a un contesto di persistenza (di solito perché il contesto di persistenza è stato chiuso o l'istanza è stata rimossa dal contesto)

// city is in a detached state, Hibernate is no longer aware of the entity 
session.evict(city)

rimosso

l'entità ha un identificatore associato ed è associata a un contesto di persistenza, tuttavia è pianificata per la rimozione dal database.

session.remove(city);


Nota: l' API Hibernate offre coppie di metodi per passare da uno stato di entità a un altro e penso che valga la pena esplorare una classe Hibernate Session .


0

Accanto alla risposta corretta già individuata persistente, transitorio, distaccato sono proprio lo stato dell'oggetto in ibernazione.

Per essere più precisi, questi tre stati mostrano effettivamente i cambiamenti degli oggetti ibernati e lo stato del ciclo di vita della sessione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.