Grails(GORM)很多

我一直在努力生产正确的配置,以在相对简单的Grails项目中产生级联删除行为。

假设我有以下简单的域类:

class Author {
    String name
    static constraints = {
    }
}

class Book {
    String title
    Author author
    static constraints = {
    }
}

如果我创建了作者,然后创建了该作者编写的图书,则无需先手动删除图书,我就无法删除作者。 我收到“完整性约束违规”。 这并不令人惊讶,因为MySQL(我的底层数据库)是由Grails在“book”表的“author”列上创建的“外键约束”作为“Restrict”创建的(这种行为与Grails的期望一致据我了解它)。

现在,如果我要将书表的“作者”列中的“底层数据库”约束从“限制”手动更改为“层叠”,我会得到我想要的行为。 也就是说,如果您删除作者,他们的所有书籍也会被删除。

所以,我想要做的就是改变我的Grails“Book”类,以便在作者列上使用“on delete cascade”创建“book”表。 我一直在阅读关于做这类事情的大量信息,GORM默认使用“belongsTo”和明确的“映射”。

基于“belongsTo”文档的一种方法是,将Book类中的行从以下版本更改为:

Author author

static belongsTo = [author:  Author]

从而明确指出作者是关系的“拥有方”。 文档似乎表明,这应该会产生我之后的级联删除行为。 但是,除非在作者类中添加明确的“hasMany = [books:Book]”,否则它不起作用。 我不想这样做。 (这个愿望在我的实际业务领域中更有意义,但即使只是作为一种理解的练习,我也还没有明白为什么我必须让作者领域类明确地了解书籍)。

我只想用grails设置来更改Book类,以便在数据库中生成“级联删除”设置,而无需更改Author类。 我尝试使用如下显式映射:

static mapping = {
        author cascade: 'all'
}

以及与其他显式映射或“belongsTo”选项的组合。 这没有奏效。

注意到对底层SQL数据库中“约束”的简单更改提供了我想要的行为,是否有一种方法可以通过Grails来实现? 如果没有,我是否误解了一些基本的东西,或者我想做些愚蠢的事情?


我认为你错过了作者 书籍类型的必填字段。

这里是示例代码,这是根据文档(测试和工作)

class Author {

    String name
    Book book //you are probably missing this field

    static constraints = {
    }
}

class Book {

    String name

    static belongsTo = [author: Author]

    static constraints = {
    }
}

测试用例:

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

正如你所看到的,你需要Author中的Book参数。 不需要hasMany或hasOne条款。

链接地址: http://www.djcxy.com/p/24333.html

上一篇: Grails (GORM) Many

下一篇: Dynamic finders with Grails many