2010-05-05 4 views
8

Je dois créer une relation plusieurs-à-plusieurs dans Grails. J'ai un domaine "Question" et un domaine "Tag". Une question peut avoir 0 ou plusieurs tags. Une balise peut avoir 0 ou plusieurs questions.Comment gérer Many-To-Many dans Grails sans appartientTo?

Si je mets un "hasMany" de chaque côté, cela me donne une erreur en disant que j'ai besoin d'un "belongsTo" quelque part. Cependant, l'ajout d'un appartient à signifie que le propriétaire doit exister ...

Comme je l'ai dit, un tag pourrait avoir 0 questions, et une question pourrait avoir 0 tags. Il n'y a pas de concept de propriétaire, c'est beaucoup-à-plusieurs!

Que suis-je censé faire?

Répondre

0

Je ne l'ai pas essayé, mais je pense que la propriété mappedBy peut être utilisée pour résoudre ce problème.

2

Si votre principale préoccupation est la suppression en cascade, vous pouvez jeter un oeil à 5.5.2.9 dans les docs grails pour le désactiver manuellement pour le mappage.

0

Extrayez le Taggable Plugin.

Il semble résoudre le problème que vous avez et vous pouvez regarder le source code si vous voulez voir comment ils ont modélisé la relation. BTW ce plugin a été créé à l'origine par Graeme Rocher qui est le développeur principal sur Grails.

6

vous pouvez le faire (s'il vous plaît voir le code ci-dessous). mais est-ce logique d'avoir une étiquette de question avec à la fois une question et une étiquette?

package m2msansbt 

    class Question { 
     String toString() { return name } 
     String name 
     static hasMany=[questionTags:QuestionTag] 
     static constraints = { 
     } 
    } 
    package m2msansbt 

    class Tag { 
     String toString() { return name } 
     String name 
     static hasMany=[questionTags:QuestionTag] 
     static constraints = { 
     } 
    } 
package m2msansbt 

class QuestionTag { 
    Question question 
    Tag tag 
    static QuestionTag link(Question question,Tag tag) { 
     QuestionTag questionTag=QuestionTag.findByQuestionAndTag(question,tag) 
     if (!questionTag) { 
      questionTag = new QuestionTag() 
      question?.addToQuestionTags(questionTag) 
      tag?.addToQuestionTags(questionTag) 
      questionTag.save() 

     } 
     return questionTag 
    } 
    static void unlink(Question question,Tag tag) { 
     QuestionTag questionTag=QuestionTag.findByQuestionAndTag(question,tag) 
     if (questionTag) { 
      question?.removeFromQuestionTags(questionTag) 
      tag?.removeFromQuestionTags(questionTag) 
      questionTag.delete() 
     } 
    } 
    static constraints = { 
    } 
} 

import m2msansbt.* 
class BootStrap { 

     def init = { servletContext -> 
      Question q1=new Question(name:'q1') 
      Tag t1=new Tag(name:'t1') 
      Tag t2=new Tag(name:'t2') 
      q1.save() 
      t1.save() 
      t2.save() 
      QuestionTag q1t1=QuestionTag.link(q1,t1) 
      q1t1.save() 
      QuestionTag q1t2=QuestionTag.link(q1,t2) 
      q1t2.save() 
      q1.save() 
      t1.save() 
     } 
     def destroy = { 
     } 
    } 
0

Cela fonctionne pour moi sur Grails 2.4.4. Ajouter un "belongsTo" avec juste le nom de la classe.

class Question { 
    String toString() { return name } 
    String name 
    static hasMany=[tags:Tag] 
    static constraints = { 
    } 
} 


class Tag { 
    String toString() { return name } 
    String name 
    static hasMany=[questions:Question] 

    static belongsTo = Question 

    static constraints = { 
    } 
} 
Questions connexes