2017-01-04 96 views
2

我有一個作者和書籍之間一對多的關係,一個作家有很多書..如何防止Grails在刪除父項時不刪除子項?

我有域類這樣

Author.groovy

class Author { 

    String authorName; 
    String authorAddress; 
    String authorCNIC; 

    static hasMany = [books:Book] 

    static constraints = { 

     books(nullable: true) 
    } 
} 

Book.groovy

class Book { 

    String bookName; 
    String Isbn; 

    static belongsTo = [author:Author] 

    static constraints = { 

     author(nullable: true) 
    } 



} 

現在當我叫這個功能

def deleteauthor() 
    { 
     def id=params.id 
     Author author = Author.findById(id); 
     author.delete(flush: true) 
     render "Author Deleted" 
    } 

它刪除作者及其所有子書..我不希望這種行爲,我希望它不能刪除作者和書籍和顯示消息不能刪除作者,首先刪除書籍...請告訴我如何做這個 ?

+0

找到作者(你這樣做),看他/她的書數,如果> 0,不要刪除,但發出錯誤信息。 – railsdog

+0

如何查看作者的書數? – Ahmad

+0

'Author author = Author.get(id)if(author.books?.size()> 0){render「failed」return} author.delete(flush:true) render「作者已刪除」但也許你需要看'cascade' http://docs.grails.org/latest/ref/Database%20Mapping/cascade.html – Vahid

回答

1

在您的作者模型,你應該添加cascade: 'none'來約束:

class Author { 

    String authorName; 
    String authorAddress; 
    String authorCNIC; 

    static hasMany = [books:Book] 

    static mapping = { 
     cascade: 'none' 
    } 
} 

這將防止刪除的書籍,並會剛剛成立author_id爲null。

UPDATE:

似乎設置cascade 'none'也將禁用級聯撲救。 因此,一個選項是在每個添加的書籍實例上手動調用save

我想其他的事情:

您可以設置級聯只工作在save-update但是當作者是刪除有約束衝突異常,因爲沒有辦法設置on delete set null Hibernate的。我們可以在beforeDelete上手動完成。

class Author { 

    String name; 

    static hasMany = [books:Book] 

    static mapping = { 
     books cascade: 'save-update' 
    } 

    def beforeDelete() { 
     Book.withNewSession { 
      Book.findAllByAuthor(this).each { 
       it.author = null 
       it.save(flush: true) 
      } 
     } 
    } 
} 

它似乎工作,雖然它不是很漂亮。

+0

我檢查它,但它仍然刪除孩子,也是父母..它不工作 – Ahmad

+0

我這個'級聯:'none''應該在映射塊 – Abs

+0

@Abs謝謝你的評論。 –

1

由於我的名譽,我不能留下評論,但我可以回答。刪除作者時刪除書籍的原因是因爲您已在作者域上設置了「belongsTo」。這決定了誰擁有這種關係以及如何處理級聯。

你可以看到如下內容:

具體做法是:

級聯

與其他relatio掌握收藏意味着掌握他們的級聯行爲。首先要注意的是,即使不存在belongsTo指定,保存也始終從父級到子級級聯。如果是這樣的話,是否有使用belongsTo的意義?是。

試想,如果我們之後,我們增加了作者和他的書在控制檯執行此代碼會發生什麼:

class Book { 
    String title 

    static constraints = { 
    title(blank: false) 
    } 

} 

class Author { 
    String name 
    Location location 

    static hasMany = [ books: Book ] 
} 

def a = Author.get(1) 
a.delete(flush: true) 

println Author.list()*.name 
println Book.list()*.title 
The output looks like this: 


[] 
[Empire, Colossus] 

換句話說,筆者已被刪除,但書籍沒有。這就是belongsTo的來源:它確保刪除級聯和保存。簡單地通過將Book static的belongsTo = Author添加到行,上面的代碼將打印Author和Book的空列表。很簡單,對吧?在這種情況下,是的,但真正的樂趣纔剛剛開始。

刪除belongsTo應該會在刪除作者時停止刪除,但會將書籍留在後面。我認爲如果有相關的實體存在,但是現在還不能記住如何去除的話,會導致刪除時出錯。這至少可以防止級聯刪除。

我認爲你可以添加'作者作者'書籍有關係仍然。