【问题标题】:Grails remove orphans many-to-many relationshipGrails 删除孤儿多对多关系
【发布时间】:2012-09-13 15:10:14
【问题描述】:

一个简单的博客应用程序,Grails 1.3.9 和 MySQL,两个域类之间的多对多关系,BlogPost 和 Tag

class BlogPost {

    String title
    String teaser
    String body
    Date updated
    Category category
    Integer priority

    static hasMany = [comments:Comment,tags:Tag]

    static belongsTo = [Category,Tag]

    static searchable = true

    String toString() {
        "$title"
    }

    static constraints = {
        title(nullable:false,blank:false,lenght:1..50)
        teaser(nullable:false,blank:false,lenght:1..100)
        body(nullable:false,blank:false,maxSize:5000)
        updated(nullable:false)
        category(nullable:false)
        priority(nullable:false)
    }
}

class Tag {

    String name
    String description

    static hasMany = [blogpost:BlogPost]

    static searchable = true

    String toString() {
        "$name"
    }

    static constraints = {
        name(nullable:false,blank:false)
        description(nullable:false,blank:false)
    }
}

Hibernate 在 MySQL 中创建三个相关的表:blog_post、tag 和 tag_blogpost

现在,如果我创建与博客文章 Y 相关的标签 X,然后删除 Y,则在 tag_blogpost 表中保留一个孤立行,标签 X 的显示视图抛出异常“不存在具有给定标识符的行:[。 ..]"

如何自动删除(在级联上)tag_blogpost 表中的孤立行?

【问题讨论】:

    标签: mysql database grails grails-orm grails-domain-class


    【解决方案1】:

    在您的模型中,BlogPost 和 Tag 之间有两种关系是否正确?要创建博客帖子,您必须有一个标签,也可以是 n 个标签?

    您创建的标签是作为标签属性还是在标签列表中关联到 BlogPost?

    如果它在标签列表中,我认为 Grails 将您的模型视为多对多并根据docs

    多对多:只保存从“所有者”到“依赖”的级联,不删除。

    在帖子标签模型中思考我认为您的方法可能是多对多关系并手动处理标签的删除,删除之前的帖子。如果您确实需要在帖子中至少有一个标签,则可以在 BlogPost 视图中强制用户选择一个标签。

    【讨论】:

    • 谢谢 Sergio ...所以根据 Grails 文档,您说自动删除多对多关系中的孤立行并不是那么简单,我会尝试解决方法,直到我了解 GORM并且 Hibernate 会更加稳固
    • 我认为你在谈论不同的东西。您指的是从多对多关系的一端到另一端的级联,而他只是在谈论级联到中间用于会计的“成员资格”行。
    【解决方案2】:

    实际上这个修改后的模型对我有用

    class BlogPost {
        String title
        String teaser
        String body
        Date updated
        Integer priority
    
        static hasMany = [blogPostTags:BlogPostTag]
        static belongsTo = [Category]
    
        String toString() {
            "$title"
        }
    
        static constraints = {
            title(nullable:false,blank:false,lenght:1..50)
            teaser(nullable:false,blank:false,lenght:1..100)
            body(nullable:false,blank:false,maxSize:5000)
            updated(nullable:false)
            priority(nullable:false)
        }
    }
    
    class Tag {
    
        String name
        String description
    
        static hasMany = [blogPostTags:BlogPostTag]
    
        String toString() {
            "$name"
        }
    
        static constraints = {
            name(nullable:false,blank:false)
            description(nullable:false,blank:false)
        }
    }
    
    class BlogPostTag {
        BlogPost blogPost
        Tag tag
    
        static belongsTo = [BlogPost,Tag]
    
        static constraints = {
            blogPost(nullable:false)
            tag(nullable:false)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多