2012-08-07 12 views
6

Il mio problema è molto semplice ma non so come rendere Hibernate come preferisco: - tabella MainTable ha Many-2-One con ParentTable (con 100 file). punto MainTable per m = 26 righe su 100 righe in ParentTableHibernate genera m + 1 query in Numero uno

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

Quando ho semplicemente query "da MainTable"

genererà 26 + 1 interroga

Quando traccio le query, la La prima query carica solo PARENT_ID utilizzato da 26 query successive. Credo che dovrebbe avere il modo di caricare l'intero PARENT_TABLE nel 1 ° interrogazione ..

Aiutateci assumendo che:

  • FetchType.EAGER è un MUST
  • Utilizzando da MainTable mt LEFT JOIN prendere genitore mt.parent è ok, ma abbiamo molti associazione
+0

Evitare N + 1 seleziona il problema: http://www.realsolve.co.uk/site/tech/hib-tip-pitfall.php?name=n1selects http://stackoverflow.com/questions/97197/what -is-the-n1-selects-problem –

+0

@Pangea: Grazie, ma qui alcuni commenti: 1) L'utilizzo di fetch join è buono, ma abbiamo circa dieci tabelle Parent. Questa sarà l'ultima soluzione 2) Vogliamo qualcosa di simile a Subselect fetch in One-2-Many, quindi 1 query per MainTable, 1 altro per la tabella correlata –

+0

@Fetch (FetchMode.JOIN) e @Fetch (FetchMode.SELECT) non dare assolutamente nulla !!! o_0 –

risposta

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

@ManyToOne 
@JoinColumn(name = "PARENT_ID") 

Questo ridurrà il numero di query di n/100 + 1.

Il motivo di questo problema è che, l'ibernazione recupera internamente i dati in modalità lazy, (Non sto parlando dello FetchMode.Lazy). La modalità Lazy può essere esclusa utilizzando FetchMode.SUBSELECT, che è applicabile solo per le raccolte. Quando si tratta di @ManyToOne, è possibile selezionare uno batch di dati, specificando lo batchSize.

descrizione breve Fetch Startegies

FetchMode.SUBSELECT

una query per il genitore, una query per la tabella correlata. Applicabile solo per il framework Collections. Sono state attivate solo 2 query.

FetchMode.SELECT

una query per Genitori, N query per il bambino.

FetchMode.JOIN

una query per il genitore, N Query per il bambino, ma il recupero del database si svolgono in anticipo Registrazione.

FetchType.Batch

una query per genitore e n/batchSize + 1 numero di query sparati.


Ci sono due tipi di recupero, in base a quando devono essere eseguite le query.

FetchType.EAGER:

Le query sono licenziato all'istante.

FetchType.LAZY:

Le query vengono sparati quando l'oggetto figlio si accede. Quindi il numero di di query eseguite dipenderà dal numero di oggetti figlio accessibili.

How the Fetch Strategies work is better explained here.

Problemi correlati