JPA中遇到一些異常的分析與解決

Spring Data JPA踩坑到填坑:1

JPA多對多關

//做者表測試

//書籍表fetch

Book和Author是多對多關係優化

先放兩張圖作個說明:Jpa底層依賴於hibernate,hibernate默認是有懶加載機制優化的spa

  • 能夠發現:默認是開啓了懶加載的,當咱們要是要到該有的查詢結果的時候,JPA纔會去給咱們查詢hibernate

  • 經過在@ManyToMany註解中配置屬性:fetch = FetchType.EAGER對象

  • 而這個頁面的信息告訴咱們,hibernate是急性加載的,一次性家讀取全部的數據,而後再被使用blog

可能引起的問題

  • failed to lazily initialize a collection of role,could not initialize proxy - no Session事務

  • 這個問題主要來源於我測試的時候發現的,沒有添加任何事務,JPA查詢數據後,自動關閉了會話內存

  • 懶加載我也手動關閉,因此當我想要使用數據的時候,會話其實已經關閉了,致使懶加載查詢數據失敗it

  • 應對方法:

    • 懶加載環境:手動給事務,儘可能在事務包裹的時候將數據所有取出來;

    • 懶加載關閉:一次性讀取所有數據,無需理會

  • ToString()方法引起棧移除

  • 當咱們對對多的時候,想打印一個檢索結果,這個時候若是咱們經過使用lombok的@ToString註解,或者自動生成ToString方法,都會形成棧內存溢出

  • A對象中有一個List<B> ,而B對象中也有一個List<A>,若是你不切斷一個其中ToString關於集合的打印,這就是一個無線輪迴的過程,就會形成棧移除

  • 應對方法:

    • 看你須要那一邊的數據爲主,若是是A對象的數據爲主,就把B對象的ToString中關於屬性List<A>屬性的打印給幹掉,便可房子無線循環問題

1

相關文章
相關標籤/搜索