2010-12-04 11 views
4

Ich habe diese Frage in den Hibernate-Foren gestellt, aber keine vollständige Antwort erhalten, daher dachte ich, ich würde sie hier erneut veröffentlichen. Hier ist die ursprüngliche Frage Thread:Welcher Hibernate FetchMode führt dazu, dass Sammlungen lazy-loaded werden?

http://forum.hibernate.org/viewtopic.php?f=1&t=1008243&p=2438963#p2438963

Auf den Punkt gebracht, ich habe eine benutzerdefinierte HQL-Abfrage, die zusammen zwei völlig unabhängige Tabellen verknüpft, und ich versuche, die „O (N + 1) wählt“ zu verhindern Problem, indem das Laden von verknüpften Sammlungen, die in meinen Hibernate-gemappten POJOs vorhanden sind, deaktiviert wird.

Anscheinend kann ich Hibernate fetch profiles dafür verwenden, aber es gibt einen Haken. Hier ist, was Hibernate FetchMode.java sagt:

/** 
* Fetch using an outer join. Equivalent to <tt>fetch="join"</tt>. 
*/ 
public static final FetchMode JOIN = new FetchMode("JOIN"); 
/** 
* Fetch eagerly, using a separate select. Equivalent to 
* <tt>fetch="select"</tt>. 
*/ 
public static final FetchMode SELECT = new FetchMode("SELECT"); 

/** 
* Fetch lazily. Equivalent to <tt>outer-join="false"</tt>. 
    * @deprecated use <tt>FetchMode.SELECT</tt> 
*/ 
public static final FetchMode LAZY = SELECT; 

Also „lazy“ nicht wirklich faul ist, es ist nur „SELECT“, das ist genau das, was ich versuche zu vermeiden.

Gibt es einen Abrufmodus, der verhindert, dass Sammlungen geladen werden? Wenn nicht, gibt es eine andere Möglichkeit, das Laden von Sammlungen im Verlauf einer bestimmten HQL-Abfrage zu deaktivieren?

Ich weiß, dass der konventionelle Weg, dies zu erreichen ist, Criteria-Abfragen zu verwenden, aber ich muss eine Join auf eine beliebige Eigenschaft tun, und soweit ich sagen kann, gibt es keine Kriterien dafür.

Antwort

5

Erstens glaube ich, dass das Standardverhalten von Hibernate Lazy-Loading ist. Überprüfen Sie, ob dies nicht bereits der Fall ist.

Dann glaube ich, dass sie die Kommentare in der Dokumentation verwechselt haben, und SELECT sollte wirklich ein Lazy Fetch sein (wenn Sie die Dokumentation der neuesten Version von Hibernate überprüfen, wird das 'eifrig' Wort entfernt).

+0

Ich habe es gerade versucht, und in der Tat verursacht 'SELECT' einen Lazy Fetch. – Asa

Verwandte Themen