1. 程式人生 > >【bug記錄】jpa 解決org.hibernate.lazyinitializationexception could not initialize proxy - no session

【bug記錄】jpa 解決org.hibernate.lazyinitializationexception could not initialize proxy - no session

多人 java 事情 false 正文 disco ble www eal

前言

最近開發項目比較忙,springcloud的筆記得稍稍放放了,下午出來個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

本文僅作記錄,寫文幫助更多人,轉載還望註明出處http://www.cnblogs.com/hellxz/p/9037597.html

【bug記錄】jpa 解決org.hibernate.lazyinitializationexception could not initialize proxy - no session