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] 展开
警告: 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] 展开
2个回答
展开全部
我研究了很久这个问题,有两个方法可以解决。
第一种:可以直接在更新或者添加方法执行之前使用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不归你管的一个错误
第一种:可以直接在更新或者添加方法执行之前使用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不归你管的一个错误
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询