2009-12-03 23 views
0

Grails 1.1.1 Goovy 1.5.7Grails GORM domaine relation classe

Dans une relation telle ceci:

Auteur 1 - n Livre n - 1 Editeur

dans Grails: Defined

class Author {   
    String firstName 
    String lastName 

    static hasMany = [books: Book]  

    static constraints = { 
     books(nullable: true) 
    } 
} 

class Book {   
    String title 
    Author author 
    Publisher publisher 

    static constraints = { 
    author(nullable: true) 
    publisher(nullable: true) 
    } 
} 

class Publisher { 

    String name 

    static hasMany = [books: Book] 

    static constraints = { 
     books(nullable: true) 
    } 
} 

Je veux charger un livre avec les valeurs de l'éditeur et l'auteur. Quand je reçois un livre avec la requête:

def book2 = Book.findAllByAuthor(author) 

-je obtenir la réponse à l'autor assosiated mais l'éditeur n'ont l'id et la classe de nom dans l'autre requête:

def book3 = Book.findAllByPublisher(publisher) 

Je me récupérer le résultat inverse, j'ai le livre avec les données de l'éditeur, mais l'auteur n'a que l'identifiant et le nom de la classe.

Où est l'erreur dans le modèle défini? o il y a une erreur dans la façon de faire les requêtes?

Edit:

J'ai besoin moyen de récupérer les valeurs uniquement avec la requête comme ceci:

def book2 = Book.findAllByAuthor(author, [fetch:[publisher:'eager']]) 

Dans celui-ci, je peux gérer la valeur de l'éditeur.

Question: Si l'éditeur avait un hasmany ou Domain lié, obtenir le livre que je suis capable de lire les attributs?

Merci. Merci.

+1

Grails 1.1.1 faisceaux Groovy 1.6.3 ($ GRAILS_HOME/lib/groovy-tout-1.6.3.jar) et à moins que vous avez remplacé ce pot Grails alors 1.1.1 serait en utilisant Groovy 1.6.3. Pas une grosse affaire, mais vaut la peine d'un commentaire :-) –

Répondre

1

La recherche paresseuse est utilisée par défaut avec les associations de type gorm. Si vous voulez activer la récupération avide, vous pouvez modifier le DSL ORM en ajoutant les correspondances bloc suivant à votre Auteur classe de domaine:

static mapping = { 
    books lazy:false 
} 

ou vous pouvez changer le mode de récupération dans l'objet de domaine en ajoutant le code suivant après votre relation de livres est définie. Faire la même chose à votre objet de domaine Publisher devrait vous permettre d'accomplir ce que vous voulez. Vous voulez faire attention à la conséquence que vous pouvez charger plus de données que vous avez l'intention de le faire.

+0

Merci. Mais je m'intéresse à l'autre côté de la question parce que vous dites: Vous voulez faire attention à la conséquence que vous pouvez charger plus de données que vous n'en avez l'intention. - Une erreur s'est produite dans la façon de faire les requêtes? J'ai trouvé une solution en ajoutant le paramètre 'fetch' au Quey: - def = book2 Book.findAllByAuthor (auteur, [ira chercher [l'éditeur: 'impatient']])) Je reçois aussi l'éditeur. Que puis-je faire si l'éditeur a une autre entité à récupérer? ajouter et ajouter des paramètres. Merci. –

+0

Si vous n'avez pas défini les autres objets référencés par Publisher avec le mode de recherche avide, vous devrez parcourir l'objet autant que je sache. –

+0

Je ne veux pas itérer encore et encore c'est mon problème. Trop d'accès au DDBB. Si je trouve quelque chose, je l'afficherai ici. Merci pour votre temps et rapidement de bonnes réponses. –

0

La méthode get() ne devrait-elle pas renvoyer ce que vous cherchez? Exemple: def book2 = Book.get (auteur)

+0

Il n'est pas bien formulé: 'def book2 = Book.get (auteur)' De cette façon: 'def book2 = Book.findByAuthor (auteur)' J'ai seulement les données du livre et le domaine de l'auteur, pas de la Éditeur. –

0

Vous feriez mieux d'utiliser Critères et de définir explicitement les relations qui devraient être chargées avec impatience. Mentionnez simplement la relation dans la requête.

Exemple:

def c = Teacher.createCriteria() 

List<Teacher> results = c.list { 
      subjects { 
       attendees {} 
      } 
     }