2017-01-04 75 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应该会在删除作者时停止删除,但会将书籍留在后面。我认为如果有相关的实体存在,但是现在还不能记住如何去除的话,会导致删除时出错。这至少可以防止级联删除。

我认为你可以添加'作者作者'书籍有关系仍然。