Cosa sono gli oggetti distaccati, persistenti e transitori in ibernazione? Si prega di spiegare con un esempio.
Cosa sono gli oggetti distaccati, persistenti e transitori in ibernazione? Si prega di spiegare con un esempio.
Risposte:
Un new
esempio 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 close
Hibernate Session
, l'istanza persistente diventerà un'istanza distaccata : non è più attaccata a Session
(ma può comunque essere modificata e ricollegata a una nuova in Session
seguito).
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.
A persistent instance has a representation in the database
Un'entità persistente non ha una rappresentazione nel database prima di eseguire il commit dell'operazione di salvataggio.
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
Lasciatemi spiegare anche dal punto di vista del Garbage Collector.
Ci sono 3 stati oggetto di ibernazione (o) Ambito oggetto di ibernazione-
È 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)
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 removed
stato):
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 .
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