2010-05-05 47 views
8

我需要在Grails中創建一個多對多的關係。如何處理Grails中的Many-to-Many而不歸屬?

我有一個「問題」域和「標籤」域。 一個問題可以有0個或更多標籤。標籤可以有0個或更多個問題。

如果我把一個「的hasMany」上的每個側面,它給了我一個錯誤說我需要一個「belongsTo關係」的地方。 但是,添加belongsTo意味着所有者必須存在...

就像我說的,標籤可以有0個問題,而一個問題可以有0個標籤。 沒有一個業主的概念,這是一個多對多!

我該怎麼辦?

回答

0

我還沒有嘗試過,但我覺得mappedBy屬性可以用來解決這個問題。

2

如果您主要關注的是級聯刪除,你可以看看在Grails的文檔5.5.2.9手動禁用它的映射。

0

結帳的Taggable Plugin

這似乎解決你的問題,你可以看看source code如果你想看看他們是如何建模的關係。順便說一下,這個插件最初由Grails的首席開發人員Graeme Rocher創建。

6

你可以這樣做(請參閱下面的代碼)。但是問問題和標籤問題都有問題嗎?

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

這對我在Grails 2.4.4上適用。添加一個只有類名的「belongsTo」。

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