1

一个简单的博客应用程序,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 表中自动删除(级联)孤立行?

4

2 回答 2

0

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

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

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

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

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

于 2012-09-13T21:55:06.813 回答
0

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

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)
    }
}
于 2012-09-14T14:45:41.623 回答