2017-06-27 49 views
0

背景休眠:避免嵌套SQL調用的子對象

使用JPA標準從數據庫中的數據和確認的相關太多的SQL調用(子實體)一個持久性問題獲取我的應用D B。

這裏拿一個例子:

ENTITY_A (parent) with 500 item types record 

ENTITY_B (child-1) with 1000 item details record 

ENTITY_C (child-2) with 1000 item details record 

ENTITY_D (child-3) with 1000 item details record 

按規定,我們需要與其子(所有實體)一起取的母公司數據。子實體已在父實體中映射到fetch=FetchType.LAZY

問題

當我們嘗試獲取500種項目類型(ENTITY_A),那麼SQL調用的數量以下面的方式調用:

  • 1呼籲Entity_A列表(以獲取所有的500條記錄)
  • 500 SQL呼籲Entity_B列表(獲取所鏈接的父ID記錄)
  • 500 SQL呼籲Entity_C列表(獲取所鏈接的父ID記錄)
  • 500 SQL調用用於Entity_D列表(抓取爲鏈接父ID的記錄)

我知道一個替代是從標準到SQL的過程調用(這將最終返回所有數據用單個SQL切換調用SQL類型)

的形式是否有使用它我們可以限制SQL調用以這種方式dB的替代方法?

+1

一些想法如何緩解N + 1 [此線索]選擇問題(https://stackoverflow.com/questions/32453989/what-is只解僱-The的解決方案,換了-N1-問題,在眠)。 –

+1

隨着標準的查詢,你可以使用'root.fetch()'與子實體以加載它們在相同的查詢。一個普通的區別聯接和獲取參加在這裏解釋說:https://stackoverflow.com/questions/17431312/difference-between-join-and-join-fetch-in-hibernate。此外,在這裏看到:https://stackoverflow.com/questions/17306655/using-the-jpa-criteria-api-can-you-do-a-fetch-join-that-results-in-only-one-joi舉一個例子。 – crizzis

回答

0

那麼有處於休眠

延遲加載的一些概念

如:

@JoinColumn(name = "USER_ID", referencedColumnName = "ID") 
@ManyToOne(fetch = FetchType.LAZY) 
private User userId; 


@OneToMany(fetch=FetchType.LAZY) 
private List<User> lstUser; 

每當父之稱。如果獲取類型設置爲LAZY。查詢將當您嘗試訪問其他實體它不會

+0

我總是需要子實體數據。即使懶惰模式,同時呼籲子實體getter方法,將火查詢的「N」號(如「N」數字父記錄是牽強)。我的問題是我們能否將Child實體調用限制爲只有一個SQL調用。 –

+0

不可能在1個查詢中獲得全部500條記錄。 – Ashish451