Possibili opzioni di stato dell'oggetto

Come avrai notato, quando un oggetto è collegato a Hibernate, il suo stato è chiamato Persistent o Managed . Quanto giusto? Persistente o gestito?

È possibile e così, e così. Secondo la specifica JPA, un oggetto ha uno stato Persist e, secondo la specifica Hibernate, il suo stato è chiamato Managed.

In Hibernate, il lavoro con il database viene eseguito tramite un oggetto di tipo org.hibernate.Session . Secondo JPA, la classe dovrebbe essere chiamata javax.persistence.EntityManager. Questo non è davvero un grosso problema, dal momento che entrambi i tipi sono interfacce.

L' interfaccia org.hibernate.Session è dichiarata in questo modo:

interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager,    QueryProducer, java.io.Serializable, SharedSessionContract {

}

Pertanto, l' interfaccia Session dispone di tutti i metodi presenti nell'interfaccia EntityManager . Ma ha anche il suo, che ha ereditato dalle versioni precedenti di Hibernate, quando non c'erano ancora le specifiche JPA.

L'intera situazione è descritta come segue:

Diamo un'occhiata a tutti i metodi dell'interfaccia di sessione, nonché alle sfumature del loro lavoro.

Le sfumature del metodo persist()

Quando salvi un oggetto nel database, devi ricordare due cose.

Innanzitutto, il salvataggio dell'oggetto comporterà l'esecuzione di uno dei comandi SQL: INSERT o UPDATE. In secondo luogo, queste azioni non si verificheranno immediatamente dopo aver chiamato il metodo dell'oggettosessione, ma solo dopo aver chiuso la transazione.

Consideriamo alcune semplici situazioni, ad esempio, hai una classe utente :

@Entity
public class User {
	@Id
	@GeneratedValue
    public Integer id;

	@Columnt(name=”user_name”)
    public String name;
}

Salviamo il suo oggetto nel database usando il metodo persist() .

User user = new User();
user.setName("Kolyan");
session.persist(user);

Lo scopo di questo metodo è salvare un nuovo oggetto nel database. Se non esiste ancora un oggetto di questo tipo, verrà aggiunto al database chiamando il metodo INSERT SQL .

Se l'oggetto è già nel database, non accadrà nulla. Tuttavia, è possibile anche un terzo caso: un tentativo di salvare un oggetto con lo stato Dissociato nel database. In questo caso, verrà generata un'eccezione. Esempio:

User user = new User();
user.setName("Kolyan");
session.persist(user);

session.evict(user);     // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!

Le sfumature del metodo save()

Il metodo save() è stato ereditato dall'attuale Hibernate dalle sue versioni precedenti. Fondamentalmente, è molto simile al metodo persist() , inoltre aggiunge un nuovo record alla tabella utilizzando il metodo INSERT. Tuttavia, ha diverse sfumature interessanti.

Innanzitutto, questo metodo restituisce un valore: il nuovo ID dell'oggetto . Come già saprai, gli oggetti di solito non hanno un ID prima di essere aggiunti al database ed è già assegnato dal database. Quindi, il metodo save() dell'oggetto sessione restituisce l'ID che è stato assegnato all'oggetto salvato.

Importante! Secondo la specifica Hibernate ID, può essere qualsiasi oggetto serializzabile, non solo un numero. Può essere una stringa, un numero, un'enumerazione, qualsiasi cosa in generale che possa essere inserita interamente in una colonna di una tabella nel database.

Il metodo save() ha un tipo di risultato Serialized, quindi il suo risultato deve essere convertito nel tipo corretto:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

Inoltre, il metodo save() ha un comportamento diverso nel caso dello stato Detached dell'oggetto. Considera tale oggetto come nuovo e aggiunge semplicemente un'altra voce:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

session.evict(user); 	// detach the object from the session
Integer id2 = (Integer) session.save(user);

Le variabili id ​​e id2 saranno diverse. Verranno aggiunti due record alla tabella nel database, uno per ogni operazione save() .