1

シンプルなブログ アプリケーション、Grails 1.3.9 と MySQL、2 つのドメイン クラス間の多対多の関係、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 で 3 つの関連テーブルを作成します: blog_post、tag、および tag_blogpost

ここで、ブログ投稿 Y に関連するタグ X を作成してから Y を削除すると、孤立した行が tag_blogpost テーブルに残り、タグ X の表示ビューで「指定された識別子を持つ行が存在しません:[...] "

tag_blogpost テーブルの孤立した行を (カスケードで) 自動的に削除するにはどうすればよいですか?

4

2 に答える 2

0

あなたのモデルでは、BlogPost と Tag の間に 2 つの関係があるのは正しいですか? BlogPost を作成するには、1 つのタグが必要で、n 個のタグを使用できますか?

作成したタグは、タグ属性として、またはタグ リストで BlogPost に関連付けられましたか?

タグリストにある場合、Grailsはモデルを多対多と見なし、ドキュメントに従っていると思います:

多対多: 「所有者」から「従属」へのカスケードのみを保存し、削除は保存しません。

投稿タグモデルで考えると、あなたのアプローチは多対多の関係になり、タグの削除を手動で処理して、前に投稿を削除できると思います。投稿に少なくとも 1 つのタグが本当に必要な場合は、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 に答える