2012-08-07 7 views
6

Mein Problem ist sehr einfach, aber ich weiß nicht, wie Hibernate macht, wie ich will: - Tabelle MainTable haben Many-2-One mit ParentTable (mit 100 Reihen). MainTable Punkt m = 26 Zeilen von 100 Zeilen in ParentHibernate generieren m + 1 Abfragen in Many-to-One

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "PARENT_ID") 
@Fetch(FetchMode.JOIN) 

Wenn ich einfach abfragen "von MainTable"

wird es generieren 26 + 1 abfragt

Wenn ich die Abfragen verfolgen, die Die erste Abfrage lädt nur PARENT_ID, die von 26 späteren Abfragen verwendet wird. Ich denke, es sollte die Art und Weise haben die ganze PARENT_TABLE in der ersten Abfrage zu laden ..

Bitte helfen Sie durch die Annahme:

  • FetchType.EAGER ist ein Muss
  • Mit von MainTable mt LEFT JOIN holen mt.parent Eltern in Ordnung ist, aber wir haben viele Verein
+0

Das Vermeiden von N + 1 wählt das Problem aus: http://www.realsolve.co.uk/site/tech/hib-tip-pitfall.php?name=n1selects http://stackoverflow.com/questions/97197/what -is-das-n1-wählt-Problem –

+0

@Pangea: Danke, aber hier ein paar Kommentare: 1) Verwenden Sie Fetch Join ist gut, aber wir haben etwa zehn Elterntabelle. Das wird die letzte Lösung sein 2) Wir wollen etwas ähnliches wie Subselect holen in One-2-Many, so dass 1 Abfrage für MainTable, 1 mehr für verwandte Tabelle –

+0

@ Fetch (FetchMode.JOIN) und @ Fetch (FetchMode.SELECT) gib überhaupt keinen Unterschied !!! o_0 –

Antwort

3
// Annotate ParentTable Persistance class file with a batch Size 
@BatchSize(size=100) 
class ParentTable{ 
    .. 
} 

@ManyToOne 
@JoinColumn(name = "PARENT_ID") 

Dies reduziert die Anzahl der Abfragen um n/100 + 1.

Der Grund für dieses Problem ist, dass der Ruhezustand die Daten im Lazy-Modus intern abrufen wird, (ich spreche nicht über die FetchMode.Lazy). Der Lazy-Modus kann durch Verwendung von FetchMode.SUBSELECT ausgeschlossen werden, was nur für Sammlungen gilt. Wenn es zu @ManyToOne kommt, können Sie eine batch von Daten auswählen, indem Sie die batchSize angeben.

eine kurze Beschreibung von Startegies

FetchMode.SUBSELECT

Eine Abfrage für Eltern, eine Abfrage für die verwandte Tabelle zu holen. Anwendbar nur für Collections-Framework. Nur 2 Abfragen ausgelöst.

FetchMode.SELECT

Eine Abfrage für Eltern, N-Abfragen für das Kind.

FetchMode.JOIN

Eine Abfrage für Eltern, N-Abfragen für Kind, aber die Datenbankabruf im Voraus erfolgen in JOIN.

FetchType.Batch

Eine Abfrage für Eltern und n/Batchsize + 1 Anzahl der gebrannten Abfragen.


Es gibt zwei Arten von Abrufen, basierend auf, wenn die Abfragen ausgeführt werden soll.

FetchType.EAGER:

Die Anfragen werden sofort gefeuert.

FetchType.LAZY:

Die Abfragen ausgelöst werden, wenn das Kind Objekt zugegriffen wird. Die Nummer der der ausgeführten Abfragen hängt von der Anzahl der untergeordneten Objekte ab.

How the Fetch Strategies work is better explained here.

Verwandte Themen