造成的原因:
其实这个是JPA Session的问题,说白了就是有一些程序使用了JPA懒加载机制,也就是说某些ASSOCIATION,是GET方法被调用才会把数据加载回来。但问题是当那个GET METHOD被调用时,对应的JPA Session就已经关闭了,所以根本没有办法加载。
解决办法有四种:
- 在报错信息里面的实体类(也就是中括号[]里面的实体类)中加上
@Proxy(lazy=false)
。 - 取消LAZY LOAD,可以通过将
@OneToMany,@ManyToOne,@OneToOne
注解中的属性fetch = FetchType.LAZY改为fetch = FetchType.EAGER。不过个人并不建议这么做,因为这其实会强迫程序多读取很多数据,无论是否需要。 - 开启
OPEN SESSION IN VIEW
,这种办法可以让SESSION在整个HTTP REQUEST周期内都存活,但我也不建议你这么做,因为这个会导致你那个连接更长时间的被HOLD住,而且OPEN SESSION IN VIEW经常引起诡异的ERROR。
4.个人比较推荐第四种,就是在相应的API接口类上加上@Transactional
注解,开启transaction的地方SESSION自然会被HOLD住。而且transaction的释放时间一定比整个HTTPREQUEST周期要短的多
相关链接
什么是Open Session In View?
https://www.baeldung.com/spring-open-session-in-view