2015-10-07 82 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