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),为什么草稿表单验证良好且没有错误?
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()
}
}