2010-05-05 7 views
8

Ho bisogno di creare una relazione molti-a-molti in Grails.Come gestire molti-a-molti in Grails senza appartiene?

Ho un dominio "Domanda" e un dominio "Tag". Una domanda può contenere 0 o più tag. Un tag può avere 0 o più domande.

Se metto un "hasMany" su ciascun lato, mi dà un errore dicendo che ho bisogno di un "belongTo" da qualche parte. Tuttavia, aggiungere un appartiene significa che il proprietario deve esistere ...

Come ho detto, un tag potrebbe avere 0 domande e una domanda potrebbe avere 0 tag. Non esiste il concetto di proprietario, è un numero molti a molti!

Cosa dovrei fare?

risposta

0

Non l'ho provato, ma penso che la proprietà mappedBy possa essere utilizzata per risolvere questo problema.

2

Se la preoccupazione principale è l'eliminazione a cascata, è possibile dare un'occhiata a 5.5.2.9 nei documenti Grails per disabilitarla manualmente per la mappatura.

0

Acquista il Taggable Plugin.

Sembra risolvere il problema che si sta verificando e si potrebbe guardare lo source code se si desidera vedere come hanno modellato la relazione. BTW questo plugin è stato originariamente creato da Graeme Rocher, che è lo sviluppatore principale di Grails.

6

si può fare questo (si prega di consultare il codice di seguito). ma ha senso avere un tag di domanda senza una domanda e un tag?

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

Questo funziona per me su Grails 2.4.4. Aggiungi un "appartiene" con solo il nome della 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 = { 
    } 
} 
Problemi correlati