Grails удаляет сиротские отношения "многие ко многим"

Простое приложение для блога, 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.

Теперь, если я создам тег X, связанный с сообщением в блоге Y, а затем удалю Y, потерянная строка останется в таблице tag_blogpost, а представление показа для тега X выдаст исключение и «Нет строки с данным идентификатором:[...] "

Как я могу автоматически удалить (каскадно) потерянную строку в таблице tag_blogpost?


person laz    schedule 13.09.2012    source источник


Ответы (2)


Правильно ли в вашей модели иметь две связи между BlogPost и Tag? Чтобы создать BlogPost, у вас должен быть один тег, а также может быть n тегов?

Созданный вами тег был связан с BlogPost как атрибут тега или в списке тегов?

Если он есть в списке тегов, я думаю, что Grails рассматривает вашу модель как многие ко многим и в соответствии с документы:

Многие ко многим: только сохраняет каскад от «владельца» к «зависимому», а не удаляет.

Думая о модели почтовых тегов, я думаю, что ваш подход может быть отношением «многие ко многим» и вручную обрабатывать удаление тега, удаляя сообщения до этого. Если вам действительно нужно иметь хотя бы один тег для сообщения, в представлении BlogPost вы можете заставить пользователя выбрать тег.

person Community    schedule 13.09.2012
comment
Спасибо, Серджио ... так что, согласно документам Grails, вы говорите, что не так просто автоматически удалять осиротевшие строки в отношениях «многие ко многим», я попытаюсь найти обходной путь, пока мои знания GORM и Hibernate не станут более прочными - person laz; 14.09.2012
comment
Мне кажется, вы говорите о другом. Вы ссылаетесь на каскадирование от одного конца отношения «многие-многие» к другому, а он говорит о каскадировании только к строке членства в середине, используемой для учета. - person sf_jeff; 10.07.2018

На самом деле эта модифицированная модель работает для меня

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)
    }
}
person laz    schedule 14.09.2012