Les utilisateurs d'Hibernate ont demandé une méthode dont l'intention générale serait soit de sauvegarder une instance éphémère
en générant un nouvel identifiant, soit mettre à jour/réattacher les instances détachées associées à l'identifiant courant.
La méthode saveOrUpdate()
implémente cette fonctionnalité.
// in the first session Cat cat = (Cat) firstSession.load(Cat.class, catID); // in a higher tier of the application Cat mate = new Cat(); cat.setMate(mate); // later, in a new session secondSession.saveOrUpdate(cat); // update existing state (cat has a non-null id) secondSession.saveOrUpdate(mate); // save the new instance (mate has a null id)
L'usage et la sémantique de saveOrUpdate()
semble être confuse pour les nouveaux utilisateurs. Premièrement, aussi longtemps que vous n'essayez pas d'utiliser des instances
d'une session dans une autre, vous ne devriez pas avoir besoin d'utiliser update()
, saveOrUpdate()
, ou merge()
. Certaines applications n'utiliseront jamais ces méthodes.
Généralement update()
ou saveOrUpdate()
sont utilisées dans le scénario suivant :
l'application charge un objet dans la première session
l'objet est passé à la couche utilisateur
certaines modifications sont effectuées sur l'objet
l'objet est retourné à la couche logique métier
l'application persiste ces modifications en appelant update()
dans une seconde sessin
saveOrUpdate()
s'utilise dans le cas suivant :
si l'objet est déjà persistant dans cette session, ne rien faire
si un autre objet associé à la session a le même identifiant, lever une exception
si l'objet n'a pas de propriété d'identifiant, appeler save()
si l'identifiant de l'objet a une valeur assignée à un objet nouvellement instancié, appeler save()
si l'objet est versionné (par <version>
ou <timestamp>
), et la valeur de la propriété de version est la même valeur que celle assignée à un objet nouvellement instancié, appeler
save()
sinon mettre à jour l'objet avec update()
et merge()
est très différent :
s'il y a une instance persistante avec le même identifiant couramment associée à la session, copier l'état de l'objet donné dans l'instance persistante
s'il n'y a pas d'instance persistante associée à cette session, essayer de le charger à partir de la base de données, ou créer une nouvelle instance persistante
l'instance persistante est retournée
l'instance donnée ne devient pas associée à la session, elle reste détachée