Hibernate lazy fetching és az n+1 probléma

A Wikipédiából, a szabad enciklopédiából

Az egyik legnagyobb probléma az objektum-relációs leképezéssel, hogy a relációs modell objektumorientált nyelvi objektumba való konvertálása sok munkával jár. Az objektum szinten lévő lekérdezések természete, illetve az O-R mapping tool (a konverziót végző eszköz) működése miatt egy lekérdezés általában durvább eredményt ad, mint amit egy sztenderd JDBC hívással elérhető.

Példa[szerkesztés]

Tekintsük az alábbi fa-struktúrát:

public class Node {
  private List<Node> children;
  private Node parent;
  private String name;
  
  public List<Node> getChildren() {
    return children;
  }
  
  public Node getParent() {
    return parent;
  }
  
  public void setChildren(List<Node> children) {
    this.children = children;
  }
  
  public void setParent(Node parent) {
    this.parent = parent;
  }
 // ...
}

A fenti Node osztály elég complex asszociációkat tartalmaz, egy egyszerű O-R mapper valószínűleg a teljes ‘Node’ táblát betöltené, hogy egy Node objektumot létrehozzon. Vegyük az alábbi fa struktúrát:

-A
|
*---B
|   |
|   *---C
|   |
|   *---D
|       |
|       *---E
|       |
|       *---F
|       |
|       *---G
*---H

Ha egy naiv O-R mapper-től C betöltését kérjük, ahhoz be kéne töltenie B-t (mivel az C apja), de B teljes betöltéséhez szükséges betölteni D-t (mivel az B gyereke) is, ami E, F, G betöltését is szükségessé teszi. Ezután folytatódna B betöltése A betöltésével, ami H betöltését is szükségessé teszi. Eredményül a teljes fát be kellett tölteni. Eközben minden asszociációs populáció külön-külön egy egyedi SQL select utasítás megadását igényli. Ez 8 gazzillion utasítást jelent csak a fenti példához. A node-ok számának növelésével pedig az SQL hívások száma lineárisan növekszik.

Ezt nevezzük n+1 problémának.