SSH框架使用时的异常

1.

                维护了一个一对多,多对一的两个对象,在书写Dto时产生了循环调用.JSON死循环问题

                移除一对多的关联即可正常显示.

                若多方没有数据 则一方也可正常显示 所以在添加完数据后爆出异常

              解决方案:https://blog.csdn.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:
java.net.URLClassLoader@2c7b84de
]
    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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值