2015-10-07 59 views
0

我想,无论何时域名被删除,全部删除hasMany域名和相关域名。我有以下域名结构。Grails:当主域对象被删除时,如何删除关联的域?

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 ] 
} 

我想删除所有选项bookOptionsBookOption每当类别被删除之间移除关联。

选项级联

目前:“全删除,孤儿”,所有选项被删除时,类别被删除,但是我遇到一个参照完整性约束违反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方式来执行此操作?或者是我定义标准的选项?

+0

有没有办法可以修改领域模型,以便关联创建一个线性的依赖关系列表,而不是您目前拥有的循环依赖关系?这对于解决这个问题将会有很长的路要走,简化单元测试等等。从我收集的内容来看,基本上'Book'有很多'Option's。一些'选项'来自'类别',另一些来自'BookOption's。所以也许'Category'和'BookOption'可以是'Option'(也就是一个子类)的特殊形式。 –

回答

0

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

0
def books = Books.findAllByCategories(category) 
books?.each{ book -> 
book?.categories?.clear() 
book?.bookOptions?.clear() 
} 
+0

谢谢,我提供的示例域有问题。图书与类别没有多少关系。我更新了这个问题。 – mcroteau

+0

bookoption belongsTo类别但类别没有关系在您的更新版本是正确的 – Vahid

+0

是的,这是正确的。 – mcroteau