【问题标题】:Grails : How do I delete associated domains whenever a main domain object is deleted?Grails:每当删除主域对象时,如何删除关联的域?
【发布时间】:2023-03-09 05:51:01
【问题描述】:

我想在删除域时删除所有 hasMany 域和关联域。我有以下域结构。

class Book {
    static hasMany = [ bookOptions: BookOption ]
}

class Category {
    static hasMany = [ options: Option ]
    static mapping = {
        options cascade: "all-delete-orphan"
    }
}

class Option {
    static belongsTo = [ category: Category ]
}

BookOption {
    Option option
    static belongsTo = [ book: Book, category: Category ]
}

我想删除所有 optionsbookOptions 并删除 BookBookOption 之间的关联strong>类别已删除。

目前使用 options cascade: "all-delete-orphan",当一个 Category 被删除时,所有 options 都会被删除,但是我遇到BookOption 的参照完整性约束违反。

一种选择是手动查找所有 bookOptions,遍历列表并删除每一个。

def bookOptions = BookOption.findAllByCategory(category)
bookOptions.each{ bookOption ->
    def book = bookOption.book
    book.removeFromBookOptions(bookOption)
    bookOption.delete(flush:true)
}

category.delete(flush:true)

是否有更多的 Grails 方式来执行此操作?还是我定义的选项是标准?

【问题讨论】:

  • 有没有一种方法可以重新设计域模型,以便关联创建一个线性的依赖关系列表,而不是你目前拥有的循环依赖关系?这对于解决这个问题、简化单元测试等将大有帮助。从我收集到的基本上,Book 有很多Options。一些Options 来自Categorys,其他来自BookOptions。所以也许CategoryBookOption 可以是Option 的特殊形式(又名。一个子类)。

标签: grails grails-orm


【解决方案1】:

我认为 Category 中应该有 hasMany bookOptions。请检查创建的表是 MyISM 还是 InnoDB。

【讨论】:

    【解决方案2】:
    def books = Books.findAllByCategories(category)
    books?.each{ book ->
     book?.categories?.clear()
     book?.bookOptions?.clear()
    }
    

    【讨论】:

    • 谢谢,我提供的示例域有问题。 Book 与 Category 没有 hasMany 关系。我更新了问题。
    • bookoption 属于类别,但类别与您的更新版本没有关系是正确的
    • 好吧,我想如果没有这种关系,它必须有点像你有它,你可以考虑使用 HQL 来连接所需的关系作为删除语句,但它仍然是 4 行左右而不是你的已经有4行左右了。嗯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多