2011-03-25 5 views
9

Ho la stessa domanda di qualcuno pubblicato nella comunità di Hibernate: FetchProfiles.Come ottenere Hibernate FetchProfile per caricare oggetti figlio profondi nella gerarchia

Per motivi di prestazioni ho un rapporto nel modello di dati come segue:

...C -[FetchType.LAZY]-> D -> [FetchType.LAZY] -> E 

Utilizzando FetchProfile posso avidamente carico D con C, ma io non riesco a capire come caricare entusiasmo E. so Posso usare con successo un NamedQuery usando inner join, ma in realtà mi infastidisce il fatto che non riesco a capire come farlo usando FetchProfile. Un esempio di un tentativo di FetchProfile (qualsiasi altra cosa si perde nella notte dei tempi):

@FetchProfile(name = "cwithDAndE", fetchOverrides = { 
     @FetchProfile.FetchOverride(entity = C.class, association = "dByCId", mode = FetchMode.JOIN), 
     @FetchProfile.FetchOverride(entity = D.class, association = "eByDId", mode = FetchMode.JOIN) 
}) 

abilito la FetchProfile per la sessione e con successo uso un session.get senza errori e C e D popolato - E è ancora pigro e disabitato. Nella disperazione ricordo di aver provato una notazione a punti per l'associazione da C verso il basso. Posso trovare solo esempi che hanno una profondità di uno.

Questo è un divario di tipo OCD, secondo le mie conoscenze, che deve essere riempito!

Grazie in anticipo per qualsiasi aiuto.

+0

Potete per favore pubblicare le annotazioni dalle classi C, D ed E? (in aggiunta ai FetchTypes) –

risposta

3

Si ha un oggetto A contenente un oggetto B, contenente un oggetto C. Di default sono

...A -[FetchType.LAZY]-> B -> [FetchType.LAZY] -> C 

Una classe: class

@FetchProfiles({ 
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "b", entity = A.class, mode = FetchMode.JOIN) }, name = "a-with-b") 
    }) 
@Entity 
@Table(name="EDITOR_IDENTITIES") 
public class A { 
    private B b;  
    //... 
} 

B:

@FetchProfiles({ 
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "c", entity = B.class, mode = FetchMode.JOIN) }, name = "b-with-c") 
    }) 
@Entity 
@Table(name="EDITOR_IDENTITIES") 
public class B { 
    private C c;  
    //... 
} 

Adao classe:

@Repository(value="aDaoImpl") 
@Transactional 
public class ADaoImpl { 

    @Override 
    public A loadByPrimaryKey(long id) 
    { 
     Session session = sessionFactory.getCurrentSession(); 
     session.enableFetchProfile("a-with-b"); 
     session.enableFetchProfile("b-with-c"); 
     Criteria criteria = session.createCriteria(A.class); 
     criteria.add(Restrictions.eq("id", id)); 
     A a = (A) criteria.uniqueResult(); 
     if(identity != null) 
      return identity; 
     else 
      return null; 
    } 
} 

otterrete A pieno di B pieno di C. Questa è una soluzione molto semplice, è possibile creare un metodo Dao prendendo una lista di profilo di recupero come argomento.

Problemi correlati