Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails/GORM中的继承和约束问题_Grails_Inheritance_Constraints_Gorm - Fatal编程技术网

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

Grails/GORM中的继承和约束问题,grails,inheritance,constraints,gorm,Grails,Inheritance,Constraints,Gorm,不知道该如何界定这个问题,但我看到了一些我无法解释的行为。。。我们将非常感谢您的帮助。我有一个超级类表单,还有一个子类DraftForm。超类对属性内容(blank:false)的约束比子类内容(nullable:true)更严格,我使用的是tablePerHierarchy false。域类如下所示 class Form { String content static constraints = { content(blank: false) } static ma

不知道该如何界定这个问题,但我看到了一些我无法解释的行为。。。我们将非常感谢您的帮助。我有一个超级类
表单
,还有一个子类
DraftForm
。超类对属性
内容(blank:false)
的约束比子类
内容(nullable:true)
更严格,我使用的是
tablePerHierarchy false
。域类如下所示

class Form { String content static constraints = { content(blank: false) } static mapping = { tablePerHierarchy false } } 班级形式{ 字符串内容 静态约束={content(blank:false)} 静态映射={tablePerHierarchy false} } 类DraftForm扩展了表单{ 静态约束={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() } } 类DraftFormIntegrationSpec扩展了规范{ 无效“测试草稿表单和从草稿表单派生的表单”(){ 给定:“具有无效表单字段的草稿表单”//1 def draftForm=新的draftForm() 当:“表格草稿生效”//2 断言draftForm.validate()==true 然后:“表格草稿无错误”//3 !draftForm.hasErrors() 当:“草稿表单已保存”//4 试一试{ draftForm.save() }捕获(例外e){ println“引发异常!” println e.class } 然后:“在数据库中找不到草稿表单”//5 draftForm.id==null 当:“草稿表格铸造为表格”//6 表单=(表单)draftForm assert form.validate()==true 然后:“表单验证,没有错误”//7 !form.hasErrors() } } 以下是我的问题:
  • 我认为子类也继承了超类的约束。在这种情况下,即使
    内容
    (请参见测试中的//2和//3),为什么草稿表单验证良好且没有错误?
  • 如果草稿表单验证良好,为什么会出现异常(//4),并且在数据库(//5)中找不到草稿表单?
  • 当将
    DraftForm
    类型转换为
    表单时,即使
    内容
    属性仍然为
    null
    ,它仍然会验证fine并且没有错误(//6和//7)。这怎么可能


    谢谢你的帮助

    请在下面找到答案

    按照grailsdoc>继承策略

    tablePerHierarchy:false将在数据库级别对表单中的内容应用非空约束,因此保存表单对象时出现异常NULL不允许列“content”

  • 是的,子类确实继承了超类约束,但对于相同的属性,子类约束将优先于子类对象。因此在//2和//3中对其进行验证
  • 例外情况是由于表格中的内容列不为空,因此如前所述,“内容”列不允许为空
  • 当DraftForm类型转换为表单时,它仍然是DraftForm的对象(尝试Form.class,您将看到“class draft.DraftForm”)因此得到验证,如果您创建一个新的表单对象,它将无法通过验证,因为content将为空

  • 希望这能让您更好地理解问题。

    save()
    返回实例或null,因此在测试中需要使用
    assert draftForm.save()!=null
    draftForm.save(failOnError:true)
    。谢谢@Sergio。如果我在没有try catch的情况下执行了
    draftForm.save(failOnError:true)
    ,则测试会在尝试保存时抛出异常,从而失败。但是,
    draftForm
    验证时没有任何问题(//2),也没有错误(//3),这让我感到困惑,但我仍然无法保存它。虽然我无法保存的事实解释了
    draftForm.id==null
    (//5),但我仍然无法解释它如何能够在没有任何错误的情况下进行验证,但仍然无法保存。 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() } }