Gle*_*nnn 5 grails grails-orm belongs-to cascading-deletes
我一直在努力在一个相对简单的 Grails 项目中产生正确的配置来产生级联删除行为。
假设我有以下简单的域类:
class Author {
String name
static constraints = {
}
}
Run Code Online (Sandbox Code Playgroud)
和
class Book {
String title
Author author
static constraints = {
}
}
Run Code Online (Sandbox Code Playgroud)
如果我创建了一个作者,然后创建了该作者写的一本书,那么如果不先手动删除该书,我将无法删除该作者。我收到“违反完整性约束”的消息。这并不奇怪,因为 MySQL(我的底层数据库)是由 Grails 创建的,在“book”表的“author”列上将“外键约束”设置为“Restrict”(这种行为与 Grails 的预期一致我理解的文档)。
现在,如果我要手动将 book 表的“author”列上的基础数据库约束从“Restrict”更改为“Cascade”,我会得到我想要的行为。也就是说,如果你删除作者,他们所有的书也会被删除。
所以,我想要做的是更改我的 Grails“Book”类,以在作者列上创建带有“删除级联”的“book”表。我一直在阅读大量有关使用“belongsTo”和显式“映射”进行此类操作和 GORM 默认值的信息。
根据“belongsTo”的文档,这样做的一种方法似乎是将 Book 类中的行从:
Author author
Run Code Online (Sandbox Code Playgroud)
到
static belongsTo = [author: Author]
Run Code Online (Sandbox Code Playgroud)
从而明确表明作者是关系的“拥有方”。文档似乎表明这应该生成我所追求的级联删除行为。但是,除非我在 Author 类中添加明确的“hasMany = [books:Book]”,否则它不起作用。我不想这样做。(这个愿望在我的实际业务领域更有意义,但即使只是作为理解练习,我还不明白为什么我必须让 Author 领域类明确了解书籍)。
我只是想要一个 grails 设置来更改 Book 类以在数据库中生成“级联删除”设置,而不必更改 Author 类。我尝试使用显式映射,如:
static mapping = {
author cascade: 'all'
}
Run Code Online (Sandbox Code Playgroud)
以及与其他显式映射或“belongsTo”选项的组合。这没有用。
注意到对底层 SQL 数据库中“约束”的简单更改提供了我想要的行为,有没有办法通过 Grails 实现这一点?如果没有,我是否误解了这里的一些基本知识,还是我试图做一些愚蠢的事情?
我认为您缺少Author中Book类型的必填字段。
这是示例代码,根据文档(已测试且有效)
class Author {
String name
Book book //you are probably missing this field
static constraints = {
}
}
class Book {
String name
static belongsTo = [author: Author]
static constraints = {
}
}
Run Code Online (Sandbox Code Playgroud)
测试用例:
@TestFor(Author)
@Mock([Book])
class AuthorTests {
@Test
void testAuthorBookCascades() {
Author a = new Author(name: "Douglas Adams")
Book b = new Book(name: "So Long, and Thanks for all the Fish")
a.book = b
a.save()
assert Author.count() == 1
assert Book.count() == 1
a.delete()
assert Author.count() == 0
assert Book.count() == 0
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,您需要 Author 中的 Book 参数。不需要 hasMany 或 hasOne 子句。
| 归档时间: |
|
| 查看次数: |
3400 次 |
| 最近记录: |