Grails,MySQL 和扩展 类

Grails, MySQL and extended classes

这是我的摘要 class :

package mypackage.commons

abstract class Content {
    String name

    static constraints = {
        name nullable: false, blank: false, size: 1..50
    }
}

这是我的 class 的扩展:

package mypackage.project

import mypackage.commons.Content

class Plane extends Content {
    String something;
}

这是我的 Bootstrap.groovy 文件:

package mypackage

import mypackage.commons.Content
import mypackage.project.Plane

class BootStrap {

    def init = { servletContext ->

        Plane boing1 = new Plane (name: 'Boing', something: 'Hello').save()
        Plane boing2 = new Plane (name: 'Boing', something: 'Goodbye').save()
        
    }
    def destroy = {
    }
}

问题是当我继续 MySQL 时,当我使用 SHOW TABLES 时,我只能看到 content 平面.

这里是SELECT的内容* FROM内容;

+----+---------+-------+-------------------------+-----------+
| id | version | name  | class                   | something |
+----+---------+-------+-------------------------+-----------+
|  1 |       0 | Boing | mypackage.project.Plane | Hello     |
|  2 |       0 | Boing | mypackage.project.Plane | Goodbye   |
+----+---------+-------+-------------------------+-----------+

编辑

测试迈克的答案后:

package mypackage.commons

abstract class Content {
    String name

    static constraints = {
        name nullable: false, blank: false, size: 1..50
    }

    static mapping = {
        tablePerHierarchy false
    }
}

这是显示表格

的结果
+-----------------------+
| Tables_in_my_database |
+-----------------------+
|  content              |
|  plane                |
+-----------------------+

这是 SELECT * FROM content 的结果:

+----+---------+-------+
| id | version | name  |
+----+---------+-------+
|  1 |       0 | Boing |
|  2 |       0 | Boing |
+----+---------+-------+

这是 SELECT * FROM plane 的结果:

+----+------------+
| id |  something |
+----+------------+
|  1 |  Hello     |
|  2 |  Goodbye   |
+----+------------+

编辑结束

预期行为:

SHOW TABLES; 应该只显示 table plane

SELECT * FROM plane 应该给我看这个:

+----+---------+-------+------------+
| id | version | name  |  something |
+----+---------+-------+------------+
|  1 |       0 | Boing |  Hello     |
|  2 |       0 | Boing |  Goodbye   |
+----+---------+-------+------------+

怎样才能得到预期的结果?

可能吗?

提前致谢。

您需要告诉 Grails 使用 table-per-subclass 策略,方法是告诉它不要使用 table-per-hierarchy,例如:

package mypackage.commons

abstract class Content {
    String name

    static constraints = {
        name nullable: false, blank: false, size: 1..50
    }

    static mapping = {
        tablePerHierarchy false
    }
}

我找到了答案,我想知道这是否是最好的方法,但它确实有效。

这个主题对我有帮助:https://github.com/grails/grails-data-mapping/issues/1254

首先,我明白如果我不想让 Grails 映射一个 class,我必须把这个 class 放在“Domain”包之外。

所以我将我的内容 class 移动到 src -> main -> groovy -> common(我创建了这个文件夹) -> Content.groovy

这是我的内容 class :

package common

abstract class Content {
    String name

    static constraints = {
        name nullable: false, blank: false, size: 1..50
    }
}

这是我的飞机class :

package mypackage.project

import common.Content

class Plane extends Content {
    String something;
}

这是我的 Bootstrap.groovy :

package mypackage

import mypackage.project.Plane

class BootStrap {

    def init = { servletContext ->

        Plane boing1 = new Plane (name: 'Boing', something: 'Hello').save()
        Plane boing2 = new Plane (name: 'Boing', something: 'Goodbye').save()
        
    }
    def destroy = {
    }
}

所以我避免使用 tablePerHierarchy。

题目中说到@MappedSupperclass,不知道指的是什么。我没用过。

达到预期的行为。

这样做正确吗?