【问题标题】:How to handle Many-To-Many In Grails without belongsTo?如何在没有belongsTo的情况下处理Grails中的多对多?
【发布时间】:2010-05-05 17:13:50
【问题描述】:

我需要在 Grails 中创建多对多关系。

我有一个“问题”域和一个“标签”域。 一个问题可以有 0 个或多个标签。一个标签可以有 0 个或多个问题。

如果我在两边都放了一个“hasMany”,它会给我一个错误,说我在某个地方需要一个“belongTo”。 但是,添加belongsTo意味着所有者必须存在...

就像我说的,一个标签可以有 0 个问题,一个问题可以有 0 个标签。 没有所有者的概念,它是多对多!

我该怎么办?

【问题讨论】:

    标签: grails many-to-many


    【解决方案1】:

    您可以这样做(请参阅下面的代码)。但是没有问题和标签的问题标签有意义吗?

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

    【讨论】:

      【解决方案2】:

      如果您主要关心的是级联删除,您可以查看 grails 文档中的 5.5.2.9 以手动禁用它以进行映射。

      【讨论】:

        【解决方案3】:

        我没有尝试过,但我认为mappedBy属性可以用来解决这个问题。

        【讨论】:

          【解决方案4】:

          查看Taggable Plugin

          它似乎解决了您遇到的问题,如果您想了解他们如何建模这种关系,您可以查看source code。顺便说一句,这个插件最初是由 Grails 的首席开发人员 Graeme Rocher 创建的。

          【讨论】:

            【解决方案5】:

            这适用于我在 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 = {
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2014-02-12
              • 2021-12-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-07-29
              • 1970-01-01
              • 2023-03-08
              • 1970-01-01
              相关资源
              最近更新 更多