2010-05-05 2 views
8

Necesito crear una relación muchos a muchos en Grails.¿Cómo manejar Many-To-Many en Grails sin belongsTo?

Tengo un dominio "Pregunta" y un dominio "Etiqueta". Una pregunta puede tener 0 o más etiquetas. Una etiqueta puede tener 0 o más preguntas.

Si pongo un "hasMany" en cada lado, me da un error al decir que necesito un "pertenece a" en alguna parte. Sin embargo, agregar un belongsTo significa que el propietario debe existir ...

Como dije, una etiqueta podría tener 0 preguntas, y una pregunta podría tener 0 etiquetas. ¡No existe el concepto de propietario, es de muchos a muchos!

¿Qué se supone que debo hacer?

Respuesta

0

No lo he probado, pero creo que la propiedad mappedBy se puede utilizar para resolver esto.

2

Si su principal preocupación es la eliminación en cascada, puede echar un vistazo a 5.5.2.9 en los documentos de grails para deshabilitarlo manualmente para la asignación.

0

Pagar el Taggable Plugin.

Parece que resuelve el problema que tienes y puedes mirar el source code si quieres ver cómo modelaron la relación. Por cierto, este complemento fue creado originalmente por Graeme Rocher, quien es el desarrollador principal de Grails.

6

puede hacerlo (consulte el código a continuación). pero, ¿tiene sentido tener una etiqueta de pregunta sin una pregunta y una etiqueta?

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

Esto funciona para mí en Grails 2.4.4. Agregue un "belongsTo" con solo el nombre de clase.

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 = { 
    } 
} 
Cuestiones relacionadas