grails - Validate()返回false,但已保存在数据库中

标签 grails gorm spock

我开始使用grails,并且偶然发现了我不了解的行为。

给定该域类

class Team {

    String name
    Date since
    Date until

    static hasMany = [teamMembers:Player]

    static constraints = {
        name nullable: false, blank: false, unique: true
        until nullable: true
        until(validator: { val, obj ->
            val?.after(obj.since)
        })

        teamMembers maxSize: 8
        //teamMembers size: 0..8
    }
}

我想进行一项集成测试,以检查您在一个团队中实际上不能有超过8名球员,所以我写了一个简化版:
void "The team can only have up to 8 players"(){

    given:
    Player[] players = (1..9).collect {new Player(name: "Foo")}

    Team t = new Team(name:"Bar", since: new Date())

    expect:
    players.each {it.validate()}
    t.validate()

    when:

    players.each {it.save()}
    t.save()

    players.each {t.addToTeamMembers(it)}

    then:
    t.validate() == false
    t.getTeamMembers().size() == 9
    Team.get(t.id).teamMembers.size == 9
    Team.first().teamMembers.size == 9
    Team.findAll()[0].teamMembers.size == 9
    Team.findByName("Bar").teamMembers.size == 9
}

据我所知,获取,查找*等击中数据库。那么为什么我的团队无法验证(预期的行为)却在数据库中有9名球员?
我想念什么?

注意:名称不是玩家的PK,我已经测试了大小和maxSize两个约束。

最佳答案

与这个问题有关的I have found this answer from Peter Ledbrook:

作为此链接的摘要:

... as soon as you call "save()" on the Team object, it is attached to the session. Any subsequent changes to that object will then be persisted to the database including any player you add



如果是正确的(我还没有真正尝试过),那应该解决它:
void "The team can only have up to 8 players"(){

given:
   Player[] players = (1..9).collect {new Player(name: "Foo")}

   Team t = new Team(name:"Bar", since: new Date())

expect:
   players.each {it.validate()}
   t.validate()

when:
   players.each {t.addToTeamMembers(it)}
   t.save()      

then:
   !t.validate()
}

这意味着仅应保存一次团队对象(假设Player具有Team域类的belongsTo)。让我知道是否可行。

关于grails - Validate()返回false,但已保存在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28946334/

相关文章:

testing - 我如何确定 Grails 应用程序是否在测试中?

java - 如何使用 grails 中的现有 java 类

java - jasper grails 插件升级到 Java8 失败

mongodb - 在grails域mongodb中的映射中按键查找

spring - Intellij是否通过Spring Boot支持独立Gorm

java - 在 IntelliJ IDEA 中调试时,无法在“评估表达式”对话框中访问 Spock 测试的变量

grails - Grails:如何最好地构造一个休眠条件构建器来搜索与域实例的 'hasMany'关系

json - 如何在grails中导出json文件?

grails - 一对多关系的Grails准则动态AND条件

升级到 2.5.0 后,使用私有(private)方法的 Grails spock 测试失败