gpt4 book ai didi

grails - Grails/GORM 中的继承和约束问题

转载 作者:行者123 更新时间:2023-12-02 04:57:21 26 4
gpt4 key购买 nike

不确定如何提出这个问题,但我看到了一些我无法解释的行为……我们将不胜感激任何帮助。我有一个父类(super class) Form 和一个子类 DraftForm。父类(super class)对属性 content(blank: false) 的约束比子类 content(nullable: true) 更严格,我正在使用 tablePerHierarchy 错误。领域类如下。

class Form {    String content    static constraints = { content(blank: false) }    static mapping = { tablePerHierarchy false }}
class DraftForm extends Form {    static constraints = { content(nullable: true) }}

使用上述领域模型,以下测试 * 通过 * 没有任何问题。

class DraftFormIntegrationSpec extends Specification {    void "Testing a draft-form and a form derived from a draft-form"(){        given: "A draft-form with invalid form-fields"          // 1        def draftForm = new DraftForm()        when: "The draft-form is validated"                     // 2        assert draftForm.validate() == true        then: "The draft-form has no error"                     // 3        !draftForm.hasErrors()        when: "The draft-form is saved"                         // 4        try{            draftForm.save()        }catch(Exception e){            println "Exception thrown!"            println e.class        }        then: "The draft-form is not found in the database"     // 5        draftForm.id == null        when: "The draft-form is casted to a form"              // 6        Form form = (Form) draftForm        assert form.validate() == true        then: "The form validates, and has no error"            // 7        !form.hasErrors()    }}

这是我的问题:

  • 我认为子类也继承了父类(super class)的约束。在那种情况下,即使 contentnull(请参阅测试中的//2 和//3),草稿表单为何能够正常验证并且没有错误?
  • 如果草稿表单验证正常,为什么我会遇到异常 (//4) 并且无法在数据库中找到草稿表单 (//5)?
  • DraftForm 被类型转换为 Form 时,它仍然可以正常验证并且没有错误(//6 和//7),即使尽管 content 属性仍然是 null。这怎么可能?

    谢谢你的帮助!

  • 最佳答案

    请在下面找到答案

    根据 grails 文档 https://grails.github.io/grails-doc/3.0.x/guide/GORM.html > 继承策略

    tablePerHierarchy:false 将在数据库级别将 NOT-NULL 约束应用于form 表中的content,因此在保存时出现异常表单对象 “CONTENT”列不允许为 NULL

    1. 是的,子类确实继承了父类(super class)约束,但对于相同的属性,子类约束将优先用于子类对象。因此它在//2 和//3 中进行验证。
    2. 异常是由于 form 表中的非空列 content 因此如前所述,“CONTENT”列 不允许为 NULL。
    3. 当 DraftForm 被类型转换为 Form 时,它仍然是 draftForm 的对象(尝试 form.class 并且您将看到“class draft.DraftForm”)因此得到验证,如果您创建Form 的新对象它将无法通过验证,因为 content 将为 null。

    希望这能让您更好地理解事情。

    关于grails - Grails/GORM 中的继承和约束问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20306151/

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