首页 > 代码库 > 利用struts进行前端页面间传值及hibernate异常:a different object with the same identifier value was already associated with the session的总结

利用struts进行前端页面间传值及hibernate异常:a different object with the same identifier value was already associated with the session的总结

2017-3-16

我使用SSH框架在做单表CRUD的更新操作时遇到了一个问题,就是页面间该怎么传值?解决该需求时引发了一系列的bug,趁还记得好好总结一番。


前端页面间传值

情景:在我查出所以记录后,点击修改会链接到新的修改页面。

技术分享

技术分享

问题:该新页面没有之前的实体信息,该如何传递要修改的实体信息给该页面,例如id?

思路1:利用struts的action来传值。

1 <form action="deleteSerCate.action" method="post">
2   <input type="hidden" name="serviceCategory.id" value="<s:property value="http://www.mamicode.com/#list.id"/>">
3   <input type="submit" value="删除">
4   <a href="serviceCId.action?serviceCategory.id=<s:property value="http://www.mamicode.com/#list.id"/>">修改</a>
5 </form>

注意看我<a>里的url,我新建了一个action,并在url里传递了id值。接着在新建的action里只做返回"success",如下:

1 // 传id到更新页面
2 public String serviceCId(){
3     return "success";
4 }

然后在struts.xml的相应action里返回到更新页面:

1 <!-- 传id到更新页面 -->
2 <action name="serviceCId" class="serCateAction" method="serviceCId">
3     <result name="success">/updateSerCate.jsp</result>
4 </action>

完成后点击“修改”后跳转到更新页面,此时页面已经可以获得需更新实体的id号了。如下:

技术分享

思路2:同样在url里传值,在新页面里用js获取值。该思路还没有实施过,但是感觉可行。待检验。

总结:前端页面间传值,前后端传值是常碰到的场景,这里我使用了action来传值是一种方法,应该还有更好的方法,以后若有新经验有待再总结。

 


 

hibernate异常:a different object with the same identifier value was already associated with the session

在更新操作中进行session.update(object);时报了上面错误。

原因在hibernate中同一session里有两个相同标识但是是不同实体的情况,即2个不同的对象关联到了同一个标志位。例如我的情况就是session中有两个对象关联到同一个id,在session进行更新操作时不知道要更新哪一个对象。

解决方法:在update前进行session.clear();操作。如下:

 

1 /* 
2  * 不clear一下会报a different object with the 
3  * same identifier value was already 
4  * associated with the session
5  */
6  session.clear();
7  session.update(serviceCategory);

有时在进行session.clear()操作后会报"Found two representations of same collection"异常,具体原因我也不懂,有待理解与解决。

解决该问题时这篇文章对我帮助最大,留言中也得到很多收获:http://www.blogjava.net/hrcdg/articles/157724.html

 

利用struts进行前端页面间传值及hibernate异常:a different object with the same identifier value was already associated with the session的总结