直接上报出的异常:
// An highlighted block
org.hibernate.ObjectNotFoundException: No row with the given identifier exists[*.*.*]
java.io.IOException: Stream closed
org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:210)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:115)
org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:177)
org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:942)
org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:652)
org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:123)
org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:374)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:278)
com.hq.basic.iterceptor.SessionIterceptor.intercept(SessionIterceptor.java:28)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:510)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:230)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
异常原因
这里核心的异常就是hibernateNotObjectFound这个异常,大家都知道hibernate表关联引用有one-to-many/many-to-one等关联关系,这个异常解释为,多方对象中没有找到一方的关联引用,导致NotFoundObject异常
异常出现场景
大多数出现的场景是因为删除了一方的对象,而多方中的关联外键并没有清空导致的
解决办法
1.如果是配置文件:
在hibernate多方配置文件中,找到具体的外键引用对象 many-to-one 标签中加入: not-found=“ignore” 代码即可解决。
2.如果是注解:
在关联对象上添加注解:@NotFound(action=NotFoundAction.IGNORE) 即可。