Grails2抽象域继承问题

Grails2抽象域继承问题,grails,gorm,Grails,Gorm,在Grails中使用抽象(或非抽象)继承时,以下内容对我不起作用 很快,我的遗产如下: abstract BaseClass { ... } SomeClass extends BaseClass { ... } SomeOtherClass extends BaseClass { ... } 然后在另一个域对象中: ThirdClass { ... BaseClass baseProperty ... } 但是现在,当我尝试将该

在Grails中使用抽象(或非抽象)继承时,以下内容对我不起作用

很快,我的遗产如下:

abstract BaseClass               { ... }
SomeClass      extends BaseClass { ... }
SomeOtherClass extends BaseClass { ... }
然后在另一个域对象中:

ThirdClass {
    ...
    BaseClass baseProperty
    ...
}
但是现在,当我尝试将该属性设置为
SomeClass
SomeOtherClass
实例时,Grails compains:

错误util.jdbceptionReporter-无法添加或更新子行:外键约束失败

这不可能吗


我还尝试使基类不抽象,并尝试将
SomeClass
SomeOtherClass
实例转换为
BaseClass
。它们产生相同的错误


更新

我刚查过。它适用于我添加的第一个子类。但是,当我尝试添加另一个子类时,它就失败了

换言之:

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`)

不知道为什么选择基类和一个子类?我已经尝试过清理等了。

我刚刚创建了与您一样的类结构(Grails 2.1.0),没有问题。它在模拟和单元测试时工作。在搭建脚手架以及从表单保存SomeClass和ThirdClass实例时也是如此。 尝试清理数据库,尤其是在没有使用“创建删除”模式的情况下。也许还有一些旧的限制。 最后一件事,您没有指定错误发生的时间-在保存(创建或更新)时?属性集上不太可能出现JDBC异常,是吗? 我不记得很清楚,但有可能在默认情况下简单属性不是级联的,然后在保存第三个类实例之前尝试保存某个类实例。您还可以使用一个关系自动级联,而不是声明简单属性,如:

class ThirdClass {
    ...
    static hasOne = [baseProperty: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)
    }

}
如您所见,一旦您持久化了某个类,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"
    }
}

我希望它能有所帮助。

是的,似乎理想的方法是基类不是域对象。不过太糟糕了,感觉有点不直观。