【bug记录】jpa 解决org.hibernate.lazyinitializationexception could not initialize proxy – no session

Java基础

浏览数:40

2019-10-5

前言

最近开发项目比较忙,Spring Cloud的笔记得稍稍放放了,下午出来个bug,恶心的不行,功能很简单,也没有什么级联或复杂的映射关系,就是一直在报三个异常

Caused by: com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.shunneng.core.web.rest.util.Result["data"]->com.shunneng.flup.web.rest.dto.SaveFlupDTO["flupForm"]->com.shunneng.flup.domain.FlupForm_$$_jvst158_3["handler"])
2018-05-14 16:54:44,571 ERROR XNIO-2 task-3 c.s.c.w.r.e.ExceptionTranslator:159 - JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: 
org.hibernate.lazyinitializationexception could not initialize proxy - no session

这些异常是最后的这个异常导致的,网上找了很多,都说是jpa或hibernate的延迟加载搞的鬼,解决方法无非就是几种,分别贴出与各位分享之

正文

五个解决方案

1、关闭LazyInitialization, 将fetch设成eager,可以在配置文件,也可注解

2、在spring boot的配置文件application.properties添加spring.jpa.open-in-view=true,yml同理

3、用spring 的OpenSessionInViewFilter

4、在spring boot的配置文件application.properties添加spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

上述几种,因为用的是springboot项目,只能用注解比较方便,都没有成功,就不详写了。介绍下面的方法,我是在一个国外网站找到的

5、在出问题的实体类上加@Proxy(lazy = false) 这里copy下机翻,英语好的可以直接移步文章出处

有情况,当我们想要一个简单的解决方案时,并不关心性能方面的任何事情,例如为了测试或原型设计的目的。在这种情况下,您可以在应用程序中进行以下配置更改以避免此错误,但请记住,如果此代码进入生产环境,则预先初始化可能导致的影响。

如果您使用XML配置:将default-lazy =“false”添加到您的 元件
如果您使用注释配置:将@Proxy(lazy = false)添加到所有实体类。

这就是如何修复线程“main”中的异常org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话。我们已经看到,这个错误主要出现在关闭连接并尝试访问未完全初始化的代理对象时。由于代理对象需要连接,因此可以将对象重新连接到会话,或者小心避免编写代码,这些代码访问未初始化的代理对象。

避免LazyInitializationException的另一种方法是通过使用lazy =“false”来禁用实体类的hibernate的懒惰初始化功能或者使用default-lazy =“false”完全禁用它。

由于性能原因,此解决方案不推荐用于生产用途,但可用于原型设计,测试和演示。当你从Hibernate 2.1升级到3.0时,如果你第一次看到这个错误,不要感到惊讶,因为这是Hibernate默认启用延迟初始化时的版本。如果您在任何其他场景中遇到此错误或尝试解决“org.hibernate.LazyInitializationException:无法初始化代理 - 无会话”,您也可以在此处发布错误和代码,我们可以一起看看。

引用文章:Dealing with org.hibernate.LazyInitializationException: could not initialize proxy – no Session in Hibernate Java

2018-05-29 最新更新,有时候还有种出现这种问题的可能是,findOne方法等写成了getOne等……

本文仅作记录,写文帮助更多人,转载还望注明出处http://www.cnblogs.com/hellxz/p/9037597.html

作者:东北小狐狸