我有一个场景,Struts2操作从后端获取模型对象并将其放入OGNL堆栈,并使用该数据更新前端视图。
然后我在视图中更改与模型对象相对应的值并进行更新。然后使用Hibernate的getSession().update(model)
方法保存该值。
问题:当模型对象被读入OGNL堆栈时,该事务上下文关闭,模型对象获得分离。
为什么我可以使用getSession().update(model)
保存更改?
我认为应该使用getSession().merge(model)
。
请帮助我理解模糊性。
答案 0 :(得分:1)
两种方法都可以将分离的对象作为参数传递,但如果上下文中有一个具有给定标识符的对象,则第一种方法会抛出异常。阅读
使用给定分离的标识符更新持久化实例 实例。如果存在具有相同标识符的持久实例, 抛出异常。
public void update(Object object);
第二种方法不会抛出异常,因为它通过标识符将现有对象加载到上下文中,更新它并返回给调用者。
将给定对象的状态复制到具有相同对象的持久对象上 标识符。如果当前没有与之关联的持久性实例 会话,它将被加载。返回持久化实例。如果 给定实例未保存,保存副本并将其作为新持久化返回 实例。给定的实例不会与会话关联。
public Object merge(Object object);