Options d'état d'objet possibles

Comme vous l'avez peut-être remarqué, lorsqu'un objet est attaché à Hibernate, son état est appelé Persistent ou Managed . Comment ça ? Persistant ou géré ?

C'est possible et ainsi de suite. Selon la spécification JPA, un objet a un état Persist, et selon la spécification Hibernate, son état est appelé Managed.

Dans Hibernate, le travail avec la base de données est effectué via un objet de type org.hibernate.Session . Selon JPA, la classe devrait s'appeler javax.persistence.EntityManager. Ce n'est pas vraiment un gros problème, puisque les deux types sont des interfaces.

L' interface org.hibernate.Session est déclarée comme ceci :

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

}

Par conséquent, l' interface Session contient toutes les méthodes qui se trouvent dans l' interface EntityManager . Mais il a aussi le sien, hérité des versions antérieures d'Hibernate, alors qu'il n'y avait pas encore de spécification JPA.

Toute cette situation est décrite comme suit :

Jetons un coup d'œil à toutes les méthodes de l'interface de session, ainsi qu'aux nuances de leur travail.

Les nuances de la méthode persist()

Lors de l'enregistrement d'un objet dans la base de données, vous devez vous souvenir de deux choses.

Tout d'abord, la sauvegarde de l'objet entraînera éventuellement l'exécution de l'une des commandes SQL : INSERT ou UPDATE. Deuxièmement, ces actions ne se produiront pas immédiatement après l'appel de la méthode de l'objetsession, mais seulement après la clôture de la transaction.

Considérons une situation simple, par exemple, vous avez une classe User :

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

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

Sauvons son objet dans la base de données en utilisant la méthode persist() .

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

Le but de cette méthode est d'enregistrer un nouvel objet dans la base de données. S'il n'y a pas encore d'objet de ce type, il sera ajouté à la base de données en appelant la méthode SQL INSERT .

Si l'objet est déjà dans la base de données, rien ne se passera. Cependant, un troisième cas est également possible - une tentative d'enregistrement d'un objet avec le statut Détaché dans la base de données. Dans ce cas, une exception sera levée. Exemple:

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!

Les nuances de la méthode save()

La méthode save() a été héritée par l'Hibernate actuel de ses versions précédentes. À la base, il est très similaire à la méthode persist() , il ajoute également un nouvel enregistrement à la table à l'aide de la méthode INSERT. Cependant, il a plusieurs nuances intéressantes.

Tout d'abord, cette méthode renvoie une valeur - le nouvel ID de l'objet . Comme vous le savez déjà, les objets n'ont généralement pas d'identifiant avant d'être ajoutés à la base de données et celui-ci est déjà attribué par la base de données. Ainsi, la méthode save() de l'objet de session renvoie l'ID qui a été attribué à l'objet enregistré.

Important! Selon la spécification Hibernate ID, il peut s'agir de n'importe quel objet sérialisable, pas seulement d'un nombre. Cela peut être une chaîne, un nombre, une énumération, n'importe quoi en général qui peut être mis entièrement dans une colonne d'une table de la base de données.

La méthode save() a un type de résultat sérialisé, donc son résultat doit être transtypé dans le type correct :

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

De plus, la méthode save() a un comportement différent dans le cas de l'état Detached de l'objet. Il considère un tel objet comme nouveau et ajoute simplement une autre entrée :

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

Les variables id et id2 seront différentes. Deux enregistrements seront ajoutés à la table dans la base de données, un pour chaque opération save() .