JPA延遲加載no Session報錯解決分析
異常展示
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ****, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:582)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:201)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:145)
at org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:261)
問題原因
觸發(fā)延遲加載的時候,session已經(jīng)失效
延遲加載原理
通過cglib對目標Entity實現(xiàn)代理,針對配置了延遲加載的屬性,修改對應get方法的邏輯,植入延遲加載邏輯
解決方式
- 不使用延遲加載
- 延遲加載的時候session活躍
我們本來就想使用延遲加載來提高性能的,不使用延遲加載只是你逃避問題的方式??!要用延遲加載的地方必須用它!!
如何讓延遲加載時session活躍
web項目
在springboot環(huán)境下,打開以下配置即可
spring.jpa.open-in-view=true
這個配置會通過WebMvcConfigurer配置一個OpenEntityManagerInViewInterceptor攔截器

而這個攔截器的作用。。我們看他的注釋就知道了

就是處理請求的全程都能獲取到EntityManager,其實就是能獲取到session的意思。
普通提供dubbo服務的項目
在接口方法上加上@Transactional注解即可。
@Override
@Transactional(rollbackFor = Exception.class)
public List<XXDTO> getAllXX() {
List<XXEntity> result = xXQueryRepository.findAll();
return XXConverter.INSTANCE.entityListToDTOList(result);
}@Transactional會保證在所注解方法作用域內(nèi)session都生效
以上就是JPA延遲加載no Session報錯解決分析的詳細內(nèi)容,更多關(guān)于JPA延遲加載no Session報錯的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot項目運行一段時間后自動關(guān)閉的坑及解決
這篇文章主要介紹了SpringBoot項目運行一段時間后自動關(guān)閉的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

