SessionFactory factory = cfg.buildSessionFactory();
Session session1 = factory.openSession();
Student s1 = null;
Object o = session1.get(Student.class, new Integer(101));
s1 = (Student)o;
session1.close();
s1.setMarks(97);
Session session2 = factory.openSession();
Student s2 = null;
Object o1 = session2.get(Student.class, new Integer(101));
s2 = (Student)o1;
Transaction tx=session2.beginTransaction();
session2.merge(s1);
Explication
Voir à partir de la ligne des numéros 4 à 7, nous viens de charger un objet s1 en session1 cache et fermé session1 au numéro de la ligne 7, de sorte que maintenant l'objet s1 dans la session1 cache sera détruit comme session1 cache expire lorsque nous disons session1.close()
.
Maintenant s1 objet sera dans la mémoire RAM de l'emplacement, pas dans la session1 cache. Ici s1 est en état détaché, et à la ligne numéro 8 nous avons modifié qui s'est détachée de l'objet s1, maintenant, si nous appelons update()
méthode, puis hibernate génère une erreur, parce que nous pouvons mettre à jour l'objet de la session seulement.
Nous avons donc ouvert une autre session [session2] à la ligne numéro 10, et encore chargés de la même étudiant objet à partir de la base de données, mais avec le nom de s2. Donc, dans ce session2, nous l'avons appelé, session2.merge(s1);
maintenant en s2 objet s1 changements seront fusionnés et enregistré dans la base de données