2016-08-23 3 views
1

Ich habe einen Tisch Benutzer, der 100 Datensätze hat.Wie Batch-Abruf im Ruhezustand mit Kind-Tabes zu verwenden?

Ich habe Kind-Tabelle namens Benutzerrollen mit 200 Datensätzen (2 für jeden Benutzer).

Wenn ich alle Benutzer dann 100 Abfragen ausführen.

Ich benutze Liste userList = session.createCriteria (User.class) .list();

Gibt es eine Möglichkeit, es zu optimieren.

Antwort

0

Das von Ihnen beschriebene Problem ist bekannt als n + 1 wählt das Problem aus.

Hiberante bietet wenige verschiedene Möglichkeiten, damit umzugehen. Eine davon ist, den Abrufmodus für die Beziehung auf EAGER zu setzen, was das Problem verursacht. one-to-many Vorausgesetzt, dass Zuordnung zwischen Tabelle Benutzer und Tabelle Userroles wird „Userroles“ genannt:

Criteria criteria = session.createCriteria(User.class); 
criteria.setFetchMode("userRoles", FetchMode.EAGER); 
List userList = criteria.list(); 
+0

Dies löst nicht das Problem wieder 100 Abfragen mit Benutzertabelle laufen äußere Verknüpfung von Benutzerrollen. Auch dieser Eager-Join wird als veraltet angezeigt.public static final FetchMode DEFAULT = new FetchMode ("DEFAULT"); \t public static final FetchMode JOIN = neuer FetchMode ("JOIN"); \t public static final FetchMode SELECT = neuer FetchMode ("SELECT"); \t/** veraltet */ \t public static final FetchMode LAZY = SELECT; \t/** veraltet */ \t public static final FetchMode EAGER = JOIN; – user3302323

+0

Tatsächlich sollten Sie FetchMode.JOIN anstelle von FetchMode.EAGER verwenden. – mateuszlo

+0

Können Sie weitere Informationen bereitstellen: Wie sehen Ihre User- und UserRoles-Entitäten aus? Und wie diese 100 Anfragen aussehen? – mateuszlo

Verwandte Themen