我需要在Grails中創建一個多對多的關係。如何處理Grails中的Many-to-Many而不歸屬?
我有一個「問題」域和「標籤」域。 一個問題可以有0個或更多標籤。標籤可以有0個或更多個問題。
如果我把一個「的hasMany」上的每個側面,它給了我一個錯誤說我需要一個「belongsTo關係」的地方。 但是,添加belongsTo意味着所有者必須存在...
就像我說的,標籤可以有0個問題,而一個問題可以有0個標籤。 沒有一個業主的概念,這是一個多對多!
我該怎麼辦?
我需要在Grails中創建一個多對多的關係。如何處理Grails中的Many-to-Many而不歸屬?
我有一個「問題」域和「標籤」域。 一個問題可以有0個或更多標籤。標籤可以有0個或更多個問題。
如果我把一個「的hasMany」上的每個側面,它給了我一個錯誤說我需要一個「belongsTo關係」的地方。 但是,添加belongsTo意味着所有者必須存在...
就像我說的,標籤可以有0個問題,而一個問題可以有0個標籤。 沒有一個業主的概念,這是一個多對多!
我該怎麼辦?
我還沒有嘗試過,但我覺得mappedBy
屬性可以用來解決這個問題。
如果您主要關注的是級聯刪除,你可以看看在Grails的文檔5.5.2.9手動禁用它的映射。
結帳的Taggable Plugin。
這似乎解決你的問題,你可以看看source code如果你想看看他們是如何建模的關係。順便說一下,這個插件最初由Grails的首席開發人員Graeme Rocher創建。
你可以這樣做(請參閱下面的代碼)。但是問問題和標籤問題都有問題嗎?
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 = {
}
}
這對我在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 = {
}
}