gpt4 book ai didi

Grails 2抽象域继承问题

转载 作者:行者123 更新时间:2023-12-02 06:03:48 25 4
gpt4 key购买 nike

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

很快,我的继承如下:

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

然后在另一个域对象中:

ThirdClass {
...
BaseClass baseProperty
...
}

但是现在,当我尝试将该属性设置为 SomeClassSomeOtherClass 实例时,Grails 会提示:

ERROR util.JDBCExceptionReporter - Cannot add or update a child row: a foreign key constraint fails ...

这不可能吗?

<小时/>

我还尝试过让基类不是抽象的,并且还尝试将 SomeClassSomeOtherClass 实例强制转换为 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`)

不知道为什么选择基类和子类之一?我尝试过清洁等。

最佳答案

首先,创建您的 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,createAt 字段也会被填充并保存。检查测试类:

@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"
}
}

希望对您有所帮助。

关于Grails 2抽象域继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12368364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com