jsp里抛异常了!修改 添加新信息都不行了抛一下异常!有知道的吗

2012-5-2918:41:38org.apache.struts.action.RequestProcessorprocessException警告:Unhandle... 2012-5-29 18:41:38 org.apache.struts.action.RequestProcessor processException
警告: Unhandled Exception thrown: class org.hibernate.NonUniqueObjectException
2012-5-29 18:41:38 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [action] in context with path [/Blog] threw exception [org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.beans.ArticleInfo#2]] with root cause
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.beans.ArticleInfo#2]
展开
 我来答
精新之F
2012-05-31 · TA获得超过429个赞
知道小有建树答主
回答量:227
采纳率:0%
帮助的人:183万
展开全部
我研究了很久这个问题,有两个方法可以解决。
第一种:可以直接在更新或者添加方法执行之前使用session.clear。先清空session,这样做的话最好把session清空封装提到action上来执行,不然的话以后就只能执行一个save或者update了。
第二种:这个比较经典了,网上没找到,我是自己发现的。使用paramsPrepareParamsStack这个拦截器,你可以定义一个prepareSave方法(prepare是固定名字save是你需要访问的方法名),这个方法会在访问此方法的之前在拦截器中调用,这样就可以再访问action之前先将你需要保存的对象查询出来使之先变为持久态,hibernate就可以帮我们管理session的标示。例如需要访问save方法,则在实现了Preparable接口的action中写下如下方法,(接口要求重写的方法不需要管)代码如下:
public void prepareSave() throws Exception {
employee = iEmployeeService.findSingerById(id);
if (employee!=null) {
employee.setDepartment(null);//标示1
employee.getRoles().clear();//标示2
}
}
这样做就必须像标示1和标示2处那样,使与你需要保存的对象有关联的对象变为游离,否则他就会去更新相关联的表,就会出现提示说id不归你管的一个错误
howardHe
2012-05-30 · TA获得超过463个赞
知道小有建树答主
回答量:248
采纳率:0%
帮助的人:217万
展开全部
意思是说Hibernate发现了两个不同的对象,但是这两个对象的主键是一样的,Hibernate不知道处理哪个了,哈哈。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式