Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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布尔字段_Grails_Gorm - Fatal编程技术网

更新时未保存Grails布尔字段

更新时未保存Grails布尔字段,grails,gorm,Grails,Gorm,我有一个模型,有两个类a和B,它们都有一个“boolean lastVersion”字段 类“A”具有关联“B”,并且在A.beforeInsert/beforeUpdate上将A.lastVersion的值复制到B.lastVersion中 A.lastVersion和B.lastVersion的默认值为true。当我将.lastVersion更改为false并执行.save()时,两个lastVersion都未设置为false。如果我执行a.save(flush:true),则只有a.b.l

我有一个模型,有两个类a和B,它们都有一个“boolean lastVersion”字段

类“A”具有关联“B”,并且在A.beforeInsert/beforeUpdate上将A.lastVersion的值复制到B.lastVersion中

A.lastVersion和B.lastVersion的默认值为true。当我将.lastVersion更改为false并执行.save()时,两个lastVersion都未设置为false。如果我执行a.save(flush:true),则只有a.b.lastVersion保存为false

你知道这里有什么问题吗

我已经使用H2数据库在v2.1.0和v2.3.7上对此进行了测试。编辑:在MySQL上测试,得到了相同的行为

您可以找到这两个示例应用程序(下面还包括代码)。这种奇怪的行为发生在运行应用程序并在控制台上检查时。有一个名为VersionTests的单元测试,它也会获得不一致的行为

package testbools
class Version {

    static constraints = {
        ci (nullable: true)
    }

    boolean lastVersion = true
    CompositionIndex ci

    def beforeInsert() {
      this.ci.lastVersion = this.lastVersion
   }
   def beforeUpdate() {
      this.ci.lastVersion = this.lastVersion
   }
}



package testbools 
class CompositionIndex {

    static constraints = {
    }

    boolean lastVersion = true

    static belongsTo = [Version]
}
以及测试:

package testbools 
import grails.test.mixin.*
import org.junit.*

/**
 * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions
 */
@TestFor(Version)
class VersionTests {

    void testSomething() {

       def v = new Version(ci: new CompositionIndex())
       if (!v.save()) println v.errors

       def vget = Version.get(1)
       assert vget.lastVersion
       assert vget.ci.lastVersion

       // change value
       vget.lastVersion = false
       if (!vget.save()) println vget.errors


       // value has been changed?
       assert !vget.lastVersion
       assert !vget.ci.lastVersion


       // value has been stored?
       def vget2 = Version.get(1)
       assert !vget2.lastVersion
       assert !vget2.ci.lastVersion
    }
}

我已经从testbools237文件中添加了您的源代码,以便于其他人查看源代码,但我没有足够的声誉来批准编辑,因此,也许原始海报或其他人可以查看和更新

您正在单元测试中创建一个新的CompositionIndex,但它没有被模拟出来,所以我认为您的测试不会像预期的那样工作。我会尝试通过以下方式创建合作者:

@Mock(CompositionIndex)
在此注释下:

@TestFor(Version)
此处的详细信息:-请参阅题为“测试混合基础”的部分

编辑:

在我的最后一篇文章中,您还需要确保您正在编辑的域模型在进行测试断言之前已实际保存到数据库中。对域对象调用save()实际上并不意味着该对象已保存,它只是意味着您已经说过要保存它。彼得·莱德布鲁克解释得很好

如果在测试断言失败之前更改保存,请从:

if (!vget.save()) println vget.errors
为此:

if (!vget.save(flush: true)) println vget.errors

然后您的测试应该按预期进行(您失败的测试现在无论如何都会在我的机器上通过)。

将模拟添加到单元测试中,但控制器中的测试代码也不起作用。我创建了一个设置和存储模型的操作,以及另一个将标志变为false的操作,只是为了在执行操作后验证数据库,并获得所描述的行为。