GORM创建具有基类名称的表而不是具体的类名

时间:2017-06-01 19:33:51

标签: grails groovy gorm

我的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 = {

    }
}

我想要一个名为user的表,其中包含基类域的字段,但是GROM会生成一个表格,而不是此规范

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驱动程序。

1 个答案:

答案 0 :(得分:1)

它会生成名称为domain的表格,因为您在映射中使用了tablePerHierarchy true

基本上,您将获得一个表,您可以在其中为子类设置不同的鉴别符。

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

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

table 'user

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

static mapping = {
    table 'user'
    tablePerHierarchy true
}

但是,如果您从user扩展了其他类,则将表命名为Domain可能没有意义。 (如果您不打算从Domain扩展其他类,则只需将您的字段添加到User域中。

如果要生成两个表格(DomainUser),请设置tablePerHierachy false

这是一篇很好的文章,其中有一些示例可以帮助您确定您希望项目的方式:

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

作为旁注:我不喜欢域名的Domain名称;当你谈论特定的Domain类和域类时,它太通用了,可能会让人感到困惑。至少将其命名为BaseDomain