2009-03-17 9 views

risposta

16

In genere il caricamento lazy ha più vantaggi di un'alternativa desiderabile (prestazioni, utilizzo delle risorse). Poiché si tratta dell'impostazione predefinita di Grails per tutte le relazioni (dal Grails 1.1), in genere non devi configurarlo per il recupero appetitoso, a meno che non si verifichino determinati problemi. Come ad esempio:

  • Condivisione di un'istanza di dominio attraversata diverse sessioni Hibernate (ad esempio, quando mette un'istanza di classe di dominio nel campo di applicazione della sessione HTTP e come accedere alle proprietà da esso - come ad esempio un utente.)
  • Ottenere LazyInitializationException quando si accede a dominio istanze di classe in layout/viste
  • Quando si è certi, si accederà a una determinata proprietà di relazione ogni volta (o la maggior parte delle volte) quando viene recuperata un'istanza, sarebbe inoltre opportuno configurare questa relazione per il recupero ansioso.

Il recupero eccessivo può essere piuttosto pericoloso quando si utilizzano database enormi. Immaginate una classe di dominio come questo:

// really bad example 
class TreeNode { 

    String name    

    TreeNode parent 

    static hasMany = [ childNodes: TreeNode ] 

    static mapping {  
     parent lazy: false 
     childNodes lazy: false 
    } 

} 

quando si legge una delle istanze TreeNode, tirerà automaticamente tutte le altre istanze della classe di dominio dal database nella vostra memoria. Quando ci sono abbastanza istanze, probabilmente ucciderai l'applicazione recuperando solo 1 istanza.