我开始使用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/