使用Struts2动作的Hibernate事务上下文

时间:2015-07-16 09:28:46

标签: hibernate jpa struts2 spring-transactions valuestack

我有一个场景,Struts2操作从后端获取模型对象并将其放入OGNL堆栈,并使用该数据更新前端视图。

然后我在视图中更改与模型对象相对应的值并进行更新。然后使用Hibernate的getSession().update(model)方法保存该值。

问题:当模型对象被读入OGNL堆栈时,该事务上下文关闭,模型对象获得分离。 为什么我可以使用getSession().update(model)保存更改? 我认为应该使用getSession().merge(model)

请帮助我理解模糊性。

1 个答案:

答案 0 :(得分:1)

两种方法都可以将分离的对象作为参数传递,但如果上下文中有一个具有给定标识符的对象,则第一种方法会抛出异常。阅读

  

使用给定分离的标识符更新持久化实例   实例。如果存在具有相同标识符的持久实例,   抛出异常。

public void update(Object object);

第二种方法不会抛出异常,因为它通过标识符将现有对象加载到上下文中,更新它并返回给调用者。

  

将给定对象的状态复制到具有相同对象的持久对象上   标识符。如果当前没有与之关联的持久性实例   会话,它将被加载。返回持久化实例。如果   给定实例未保存,保存副本并将其作为新持久化返回   实例。给定的实例不会与会话关联。

public Object merge(Object object);