Grails删除了孤儿的多对多关系

时间:2012-09-13 15:10:14

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

一个简单的博客应用程序,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的show视图将抛出异常“没有给定标识符的行存在:[。 ..]“

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

2 个答案:

答案 0 :(得分:0)

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

您创建的代码是否与BlogPost相关联,作为代码属性还是在代码列表中?

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

  

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

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

答案 1 :(得分: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)
    }
}