GORM 使用基本 class 名称而不是具体 class 名称创建表

GORM creating tables with base class name instead concrete class name

我的 gorm 包中有以下域:

Domain.groovy

package gorm

class Domain {
    String createdBy
    static constraints = {
    }
    static mapping = {
        tablePerHierarchy true
    }

}

User.groovy

package gorm

class User extends Domain {
    String name

    static constraints = {

    }
}

我想要一个具有基本 class 域字段的 table 命名用户,但是 GROM 生成了一个 table 这个规范

create table domain
(
    id bigint auto_increment
        primary key,
    version bigint not null,
    created_by varchar(255) not null,
    class varchar(255) not null,
    name varchar(255) null
)

我在 grails 2.5.6 中使用 mysql 驱动程序。

它生成名称为 domain 的 table,因为您在映射中使用 tablePerHierarchy true

基本上,您会得到一个 table,您可以在其中为子 class 设置不同的鉴别器。

有关继承策略的更多信息,请参阅此处:http://docs.grails.org/2.5.x/guide/single.html#GORM (向下滚动到:7.2.3 GORM 中的继承)

如果您只是希望 schema-export 生成名称为 user 的 table,那么您需要将以下内容添加到 Domain 中的映射块 class:

table 'user'

所以整个映射块看起来像:

static mapping = {
    table 'user'
    tablePerHierarchy true
}

但是,如果您有其他 class 扩展自 Domain,则将 table 命名为 user 可能没有意义。 (如果您不打算从 Domain 扩展其他 classes,那么只需将您的字段添加到您的 User 域中即可)。

如果要生成两个table(DomainUser),则设置tablePerHierachy false.

这是一篇很棒的文章,其中包含示例,可以帮助您决定项目的方向:

https://sysgears.com/articles/advanced-gorm-features-inheritance-embedded-data-maps-and-lists-storing/

附带说明:我不喜欢域名 class 的名称 Domain;它过于笼统,当您谈论特定的 Domain class 与域 class 时,可能会让人感到困惑。至少将其命名为 BaseDomain