Java 会话缓存和更新/合并方法
在诸如update()和merge()之类的博客中有很好的解释,当我们需要更新某个分离的实体时,update()和merge()方法的行为可能会有所不同。另一方面,博客指出: 一级缓存与“会话”对象关联,应用程序中的其他会话对象无法看到它。缓存对象的作用域为会话一旦会话关闭,缓存对象将永远消失。 以下是参考[]中的代码片段:Java 会话缓存和更新/合并方法,java,hibernate,session,caching,Java,Hibernate,Session,Caching,在诸如update()和merge()之类的博客中有很好的解释,当我们需要更新某个分离的实体时,update()和merge()方法的行为可能会有所不同。另一方面,博客指出: 一级缓存与“会话”对象关联,应用程序中的其他会话对象无法看到它。缓存对象的作用域为会话一旦会话关闭,缓存对象将永远消失。 以下是参考[]中的代码片段: 我的问题是:session和session2是两个不同的session对象。为什么update()方法在关闭对象会话时抛出一个ununiqueObjectException
我的问题是:
session
和session2
是两个不同的session
对象。为什么update()
方法在关闭对象会话时抛出一个ununiqueObjectException
,它应该销毁对象student
?(因此我们不可能遇到这样的异常。)您遇到了什么样的异常?@MichielLeegwater如果有另一个实体对象具有相同的id,那么我们将得到ununiqueObjectException。这篇文章有助于理解这个问题吗?另一种预感可能是会话已关闭,但加载的对象仍认为自己已连接。要对其进行排序,对象需要分离。看见
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();