SSH框架使用时的异常
1.
维护了一个一对多,多对一的两个对象,在书写Dto时产生了循环调用.JSON死循环问题
移除一对多的关联即可正常显示.
若多方没有数据 则一方也可正常显示 所以在添加完数据后爆出异常
解决方案:https://blog.****.net/tomcat_2014/article/details/50624869 这篇文章很详细.
2.Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: failed to lazily initialize a collection of role: com.dream.po.User.orders, could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.dream.po.User.orders, could not initialize proxy - no Session (through reference chain: com.dream.vo.DataTable["data"]->java.util.ArrayList[0]->com.dream.dto.UserDto["orders"])
这是说当一对多关联时,是懒加载. 那么就会触发session关闭的问题,session在请求完成后关闭,当懒加载请求获取多方的对象时,session已经关闭,导致的异常.
解决方案:@OneToMany(mappedBy = "user",fetch = FetchType.EAGER) 将懒加载改为迫切加载
还有其它方案,加入相应的Dto对象(个人使用的就是po+dto+vo的形式依然报错 可能是使用不规范所造成,最后使用的是改为迫切加载)
3.cannot simultaneously fetch multiple bags: [com.dream.po.User.orders, com.dream.po.User.roles]
问题出现的原因由于持久层实时加载太多异同对象而致. 如果全部都是用迫切加载的话,会导致这样的错误.
解决方案:1.将ArrayList改为Set集合 .
List集合 可重复有序的 Set集合 不可重复 无序的 因此 如果采用list集合可能导致大量重复的对象存入 使用set集合将重复对象过滤则可由效的解决.
2.fetch的EAGER(迫切)加载改成LAZY(懒加载)加载.
4.在Role的实体类中维护了Menu类以多对多的方式并且添加了迫切加载.(添加初衷:防止懒加载与session关闭的矛盾)
而Menu对象又是一个一对多多对一自维护对象且添加了@OneToMany(fetch = FetchType.EAGER)
在RoleDaoImpl中调用sessionFactory.getCurrentSession().get(Role.class,id);获得了一个Role对象
但是这个对象中,List<Menu>出现了bug
可以看见 0-4 id都为164 而实则 List<Menu>中仅有两个对象 其它对象的位置应是id=164的menu的子类 但是没被选中 出现这个bug的原因未知.遍历这个List<Menu>则会得到
解决方案:调用session中的createQuery("from Role where id= ?",Role.class).setParameter(0, id).uniqueResult();来查询指定Id的Role.
5.多对多的删除
staff维护关系数据
当需要删除staff时.添加了一个deleteFromStaff_Position(Integer id)方法.删除staff和position的关联表中staff_id = id的数据.之后再删除staff.
当要删除position时,想复制staff的删除方法,需要删除staff_position关系表中含有需要删除的position的数据,但是不论是利用position_id或是使用staff_id都无法删除关系列表中的数据.原因:多对多中是由staff来维护的关系数据,无法删除.
之后又想到了staff相应的update方法,实现了如下方法:
由相应的position查出相应的List<Staff> staffs,循环移除staffs 中的指定position,在调用update方式.则可以实现删除相应的关系表中的数据.
6.Positional parameter are considered deprecated; use named parameters or JPA-style positional parameters instead.
是由于return sessionFactory.getCurrentSession().createQuery("from Dept where id = ?",Dept.class).setParameter(0, deptParentId).uniqueResult();
使用老的JPA方法定义动态变量.
修改为id = :id).setParameter("id',id)可解决.
7.Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'multipartResolver': Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [org.springframework.web.multipart.commons.CommonsMultipartResolver] from ClassLoader [ParallelWebappClassLoader
context: BookManagement
delegate: false
----------> Parent Classloader:
[email protected]
]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:262)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1198)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1123)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:676)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:642)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:690)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:558)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:499)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:172)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1183)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1099)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:779)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:133)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:745)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
在SpringMVC配置中配置了
<bean name="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
pom文件忘记导入相应的依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>