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,不知道指的是什么。我没用过。
达到预期的行为。
这样做正确吗?
这是我的摘要 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,不知道指的是什么。我没用过。
达到预期的行为。
这样做正确吗?