Grails的2抽象域继承问题(Grails 2 abstract domain inheritan

2019-09-22 07:56发布

下面Grails中使用抽象的(或者非抽象为此事)继承时,不是为我工作。

很快,我的产业如下:

abstract BaseClass               { ... }
SomeClass      extends BaseClass { ... }
SomeOtherClass extends BaseClass { ... }

然后在另一个域对象:

ThirdClass {
    ...
    BaseClass baseProperty
    ...
}

但是现在,当我试图将其属性设置为一个SomeClassSomeOtherClass例如,Grails的孔潘:

错误util.JDBCExceptionReporter - 不能添加或更新子行,外键约束失败...

这是不可能的?


我也曾尝试具有基类不能是抽象的,并且还试图铸造SomeClassSomeOtherClass实例BaseClass 。 他们产生了同样的错误。


UPDATE

我只是检查。 它的工作原理为我添加的第一个亚类。 但只要我尝试添加其他子类失败。

换一种说法:

def prop1 = new ThirdClass(baseProperty: instanceOfSomeClass).save()

工作正常。 但是,当我再尝试这样做:

def prop2 = new ThridClass(baseProperty: instanceOfSomeOtherClass).save()

它失败。


更新2

进一步的调查表明,某事在创建表的过程中出错。 它正确地增加了两个外键的ThirdClass表,但按键错误地引用:

CONSTRAINT `...` FOREIGN KEY (`some_id`) REFERENCES `base_class` (`id`),
CONSTRAINT `...` FOREIGN KEY (`some_id`) REFERENCES `some_class` (`id`)

不知道为什么它选择的基类和子类中的一个? 我曾尝试清洗等。

Answer 1:

首先,创建域结构之外你的BaseClass。 它必须是一个外部类,把它放在脚本文件,源文件夹。

package com.example.model

/**
 * @author Inocencio
 */
class BaseClass {

    Date createdAt = new Date()

}

现在,创建一个普通域类并扩展它。

package com.example.domain

import com.example.model.BaseClass

class SomeClass extends BaseClass {

    String name

    static constraints = {
        name(nullable: false)
    }

}

正如你所看到的,一旦你坚持SomeClass的一个createdAt字段填,并保存为好。 检查测试类的:

@TestFor(SomeClass)
class SomeClassTests {

    void testSomething() {
        def some = new SomeClass()
        some.name = "Hello There"
        some.save()

        //find it
        def someFind = SomeClass.list()[0]

        assert someFind

        assertTrue someFind.createdAt != null

//        println "Date: $someFind.createdAt"
//        println "Name: $someFind.name"
    }
}

我希望这会有所帮助。



Answer 2:

我刚刚创建的类结构,你(Grails的2.1.0),并没有问题。 它的工作原理嘲笑和单元测试时。 脚手架和SomeClass的和三级栏目实例时,从形式保存在同一个。 尝试清洁您的数据库,特别是如果你还没有使用“创建降”模式。 也许有留下一些旧约束。 在保存(创建或更新) - 最后一件事,发生错误时,你没有指定? 这是相当不可能得到的属性集JDBC例外,是吗? 我不记得了肯定,但它可能是简单的属性不是默认级联然后尝试保存三级栏目实例之前保存SomeClass的实例。 您也可以自动级联,而不是通过像使用hasOne关系宣告简单的属性:

class ThirdClass {
    ...
    static hasOne = [baseProperty:BaseClass]
}


文章来源: Grails 2 abstract domain inheritance issue
标签: grails gorm