Я должен создать many-many отношения в Grails.
У меня есть домен "Question" и домен "Tag". Вопрос может иметь 0 или больше тегов. Тег может иметь 0 или больше Вопросов.
Если я поместил "hasMany" на каждого, примыкает, он дает мне ошибку при высказывании, что мне нужен "belongTo" где-нибудь. Однако добавление belongsTo означает, что владелец должен существовать...
Как я сказал, Тег мог иметь 0 вопросов, и Вопрос мог иметь 0 тегов. Нет никакого понятия о владельце, это - many-many!
Что я, как предполагается, делаю?
Если вас больше всего беспокоит каскадное удаление, вы можете взглянуть на 5.5.2.9 в документации grails, чтобы вручную отключить его. для отображения.
Я не пробовал, но думаю, что свойство mappedBy
можно использовать для решения этой проблемы.
Проверьте Taggable Plugin.
Кажется, он решает проблему, с которой вы столкнулись, и вы можете посмотреть исходный код, если хотите увидеть, как они смоделировали отношения. BTW этот плагин был изначально создан Graeme Rocher, который является ведущим разработчиком Grails.
вы можете это сделать (см. Код ниже). но имеет ли смысл иметь вопросительный тег без вопроса и тега?
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 = {
}
}