2017-06-27 3 views
0

Hintergrund Objekte:Hibernate: Verschachtelte SQL-Aufruf Vermeiden für Kinder

Meine Anwendung JPA Kriterien wird unter Verwendung der Daten von DB und Dauerhaftigkeit Problem in zu viele SQL-Aufrufe im Zusammenhang identifiziert zu holen (für ein Kind Einheiten) zu DB.

Nehmen wir ein Beispiel hier:

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 

wie pro Anforderung, wir brauchen ihre Kind holen Daten für übergeordnete Entität zusammen mit (alle Einheiten). Untergeordnete Entitäten sind bereits mit fetch=FetchType.LAZY in der übergeordneten Entität zugeordnet.

Problem:

Wenn wir versuchen, 500 Elementtypen (ENTITY_A) zu holen, dann ist die Anzahl der SQL-Anrufe wird in folgenden Weise aufgerufen:

  • 1 Aufruf zur Entity_A List (holen alle 500 Datensätze)
  • 500 SQL-Aufrufe für Entity_B List (um Datensätze für die verknüpfte Eltern ID) (
  • 500 SQL-Aufrufe für Entity_C Liste zu holen Datensätze für die verknüpfte Eltern ID holen)
  • 500 SQL-Aufrufe für Entity_D List (um Datensätze für die verknüpfte Eltern ID zu holen)

Ich kenne einen alternativen ist von Kriterien zu SQL Prozeduraufruf zu wechseln (die alle Daten schließlich mit einer einzigen SQL zurück Aufruf in Form von SQL-Typen)

Gibt es einen alternativen Weg, mit dem wir die SQL-Aufrufe auf DB auf diese Weise begrenzen können?

+1

Einige Ideen, wie die N + 1 zu beheben, wählt Problem in [diesem Thread] (https://stackoverflow.com/questions/32453989/what-is -die-Lösung-für-die-n1-Problem-im-Ruhezustand). –

+1

Bei Kriterienabfragen können Sie 'root.fetch()' mit den untergeordneten Entitäten verwenden, um sie in dieselbe Abfrage zu laden. Der Unterschied zwischen einem regulären Join und einem Fetch-Join wird hier erläutert: https://stackoverflow.com/questions/17431312/difference-between-join-and-join-fetch-in-hibernate. Siehe auch hier: https://stackoverflow.com/questions/17306655/using-the-jpa-criteria-api-can-you-doa-a-fetch-join-that-results-in-only-one-joi zum Beispiel. – crizzis

Antwort

0

Nun gibt es einige Konzept Lazy Loading in Hibernate

zB:

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


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

, wenn Eltern genannt wird. Wenn Abrufart auf LAZY gesetzt ist. Abfrage wird nur ausgelöst, wenn Sie versuchen, auf diese Entität zuzugreifen, sonst wird es nicht

+0

Ich brauche Child-Entity-Daten immer. Selbst beim Lazy-Modus beim Aufruf der Child-Entity-Getter-Methode wird die Anzahl der Abfragen "N" ausgelöst (wenn die N-Nummer des übergeordneten Datensatzes abgerufen wird). Meine Frage ist, können wir Child-Entity-Aufruf auf nur 1 SQL-Aufruf beschränken. –

+0

Nein, es ist nicht möglich, alle 500 Datensätze in 1 Abfrage zu erhalten. – Ashish451

Verwandte Themen