在[1]之类的博客中已经很好地解释了,如果我们需要更新某些分离的实体,则update()和merge()方法的行为可能会有所不同。另一方面,博客[2]指出:
一级缓存与“会话”对象关联,应用程序中的其他会话对象看不到它。缓存对象的范围是会话。 会话关闭后,缓存的对象将永远消失。
以下是参考文献[1]中的代码段:
Session session = factory.openSession();
Student student = (Student) session.get(Student.class, 111);
session.close();
student.setName("chandrashekhar");
Session session2 = factory.openSession();
Student student2 = session2.get(Student.class, 111); //a new Student object with id=111
Transaction tx = session2.beginTransaction();
session2.update(student); //throws NonUniqueObjectExcpetion because there's already *student2* in session2 cache
tx.commit();
这是我的问题:session
和session2
是两个不同的Session
对象。为什么update()
方法会在关闭对象NonUniqueObjectExcpetion
的同时抛出session
的情况下本来应该毁坏对象student
的原因呢? (因此我们不可能遇到这样的异常。)