spring-data-jpa對于懶加載問題處理的總結(jié)

問題的癥結(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)引用的問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容