Extrait de la doc officielle Hibernate 3.1 final :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| - Si vous décidez d'utiliser le paradigme session-par-requête discuté plus haut, toutes les entités chargées en mémoire deviendront des objets détachés durant le temps de réflexion de l'usager. Hibernate vous permet de rattacher ces objets et de persister les modifications y ayant été apportées. Ce pattern est appelé: session-per- request-with-detached-objects (littéralement: session- par-requête-avec-objets-détachés). Le versionnage automatique est utilisé afin d'isoler les modifications concurrentes.
...
11.3.3. Les objets détachés et le versionnage automatique
Chaque interaction avec le système de persistance se fait via une nouvelle Session . Toutefois, les mêmes instances d'objets persistants sont réutilisées pour chacune de ces interactions. L'application doit pouvoir manipuler l'état des instances détachées ayant été chargées antérieurement via une autre session. Pour ce faire, ces objets persistants doivent être rattachés à la Session courante en utilisant Session.update() , Session.saveOrUpdate() , ou Session.merge() .
// foo est une instance chargée antérieurement par une autre session
foo.setProperty("bar");
session = factory.openSession();
Transaction t = session.beginTransaction();
session.saveOrUpdate(foo); //Utiliser merge() si "foo" pourrait avoir été chargé précédement
t.commit();
session.close(); Encore une fois, Hibernate vérifiera la version des instances devant être actualisées durant le flush(). Une exception sera lancée si des conflits sont détectés.
Vous pouvez également utiliser lock() au lieu de update() et utiliser le mode LockMode.READ (qui lancera une vérification de version, en ignorant tous les niveaux de mémoire cache) si vous êtes certain que l'objet n'a pas été modifié.
Lien pr plus d'infos :
http://www.hibernate.org/hib_docs/v3/reference/fr/html/transactions.html#transactions-optimistic-detached |
Ms qd j'utilise le merge(), j'ai toujours un :
failed to lazily initialize a collection of role
J'ai bien reussi a re-lier une session a mon objet mais je sais pas si c'est correctement fait ...
1 2 3 4 5 6 7 8 9
|
// Ouvre une nouvelle session
s = HibernateUtil.getCurrentSession();
// Maj de l'objet -> (verifier si il a ete supprimer entre tps)
s.refresh(this);
// Ensuite, je peux utiliser mes accesseurs pour peupler mes collections
... |
Qu'est ce que vous en penser ... merci pr votre aider
Partager