問題的癥結(jié):Repository對象是動態(tài)生成的Proxy,我們很難向其中增加代碼,所以只能在業(yè)務(wù)或控制器層增加加載代碼,但此時(shí)session已經(jīng)關(guān)閉,再查詢懶加載對象,就會觸發(fā)異常,本文就此展開。
本文的寫作地:鴨綠江中朝邊境2021年8月20日.jpg
1. 加入聲明式事務(wù):
在業(yè)務(wù)方法上增加了@Transaction,這樣會將session打開和關(guān)閉推遲到業(yè)務(wù)方法的邊界,從而可以完成懶加載的目的,但由于查詢方法是沒有事務(wù)的,所以此方法是不生效的。
2. 使用OpenSessionInView的方式:
在配置文件中加入:
spring:
jpa:
open-in-view: true
此方式將session的打開和關(guān)閉放置到了攔截器中,從而可以保證在一次請求過程中,始終處于session的打開,即持久化對象的狀態(tài)為持久態(tài),從而可以保證在視圖得到的對象是可以進(jìn)行懶加載的。
但此方式要注意:會出現(xiàn)循環(huán)引用的問題。
解決方法是:使用jackson的@JsonBackReference;@JsonIgnore;@JsonIgnoreProperties。
3. 允許在沒有事務(wù)的狀態(tài)下,進(jìn)行對象的懶加載操作。
如前文,查詢是沒有事務(wù)的,所以不能將session的打開和關(guān)閉進(jìn)行推遲到業(yè)務(wù)的操作,但此配置可以避免此問題(原理仍在探索中),方法如下:
spring:
jpa:
properties:
hibernate:
enable_lazy_load_no_trans: true
同樣,在視圖層要注意循環(huán)引用的問題。
