我有三个域对象定义为:
class Member {
String name
static constraints = {}
static belongsTo=[community:Community]
}
class Community {
String leaderName
String code
static constraints = {}
static hasMany=[members: Member]
static belongsTo=[bank:Bank]
}
class Bank {
String bankName
static hasMany=[communities: Community]
static constraints = {}
}
当我尝试使用BootStrap.groovy
配置类中的一些测试数据初始化这些域对象时:
def init = { servletContext ->
def m1 = new Member(name:"M1_Name")
def m2 = new Member(name:"M2_Name")
def m3 = new Member(name:"M3_Name")
m1.save(failOnError:true)
m2.save(failOnError:true)
m3.save(failOnError:true)
def comA = new Community(leaderName:"LeaderA", code:"AA")
def comB = new Community(leaderName:"LeaderB", code:"BB")
comA.addToMembers(m1)
comA.addToMembers(m2)
comB.addToMembers(m3)
comA.save(failOnError:true)
comB.save(failOnError:true)
def bankA = new Bank(bankName:"BankA")
def bankB = new Bank(bankName:"BankB")
bankA.addToCommunities(comA)
bankB.addToCommunities(comB)
bankA.save(failOnError:true)
bankB.save(failOnError:true)
}
我收到以下错误:
| Loading Grails 2.0.4
| Configuring classpath.
| Environment set to development.....
| Packaging Grails application.....
| Compiling 3 source files.....
| Running Grails application
| Error 2012-07-13 22:14:44,798 [pool-5-thread-1] ERROR context.GrailsContextLoader - Error executing bootstraps: Validation Error(s) occurred during save():
- Field error in object 'mygrailtests.Member' on field 'community': rejected value [null]; codes [mygrailtests.Member.community.nullable.error.mygrailtests.Member.community,mygrailtests.Member.community.nullable.error.community,mygrailtests.Member.community.nullable.error.mygrailtests.Community,mygrailtests.Member.community.nullable.error,member.community.nullable.error.mygrailtests.Member.community,member.community.nullable.error.community,member.community.nullable.error.mygrailtests.Community,member.community.nullable.error,mygrailtests.Member.community.nullable.mygrailtests.Member.community,mygrailtests.Member.community.nullable.community,mygrailtests.Member.community.nullable.mygrailtests.Community,mygrailtests.Member.community.nullable,member.community.nullable.mygrailtests.Member.community,member.community.nullable.community,member.community.nullable.mygrailtests.Community,member.community.nullable,nullable.mygrailtests.Member.community,nullable.community,nullable.mygrailtests.Community,nullable]; arguments [community,class mygrailtests.Member]; default message [Property [{0}] of class [{1}] cannot be null]
Message: Validation Error(s) occurred during save():
- Field error in object 'mygrailtests.Member' on field 'community': rejected value [null]; codes [mygrailtests.Member.community.nullable.error.mygrailtests.Member.community,mygrailtests.Member.community.nullable.error.community,mygrailtests.Member.community.nullable.error.mygrailtests.Community,mygrailtests.Member.community.nullable.error,member.community.nullable.error.mygrailtests.Member.community,member.community.nullable.error.community,member.community.nullable.error.mygrailtests.Community,member.community.nullable.error,mygrailtests.Member.community.nullable.mygrailtests.Member.community,mygrailtests.Member.community.nullable.community,mygrailtests.Member.community.nullable.mygrailtests.Community,mygrailtests.Member.community.nullable,member.community.nullable.mygrailtests.Member.community,member.community.nullable.community,member.community.nullable.mygrailtests.Community,member.community.nullable,nullable.mygrailtests.Member.community,nullable.community,nullable.mygrailtests.Community,nullable]; arguments [community,class mygrailtests.Member]; default message [Property [{0}] of class [{1}] cannot be null]
Line | Method
->> 13 | doCall in BootStrap$_closure1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 301 | evaluateEnvironmentSpecificBlock in grails.util.Environment
| 294 | executeForEnvironment . . . . . in ''
| 270 | executeForCurrentEnvironment in ''
| 303 | innerRun . . . . . . . . . . . . in java.util.concurrent.FutureTask$Sync
| 138 | run in java.util.concurrent.FutureTask
| 886 | runTask . . . . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
| 908 | run in ''
^ 662 | run . . . . . . . . . . . . . . in java.lang.Thread
这里,第13行是
m1.save(failOnError:true)
你能告诉我发生了什么事吗?或者我错过了什么。
更新:
当我删除belongsTo
和Member
个对象中的Community
关系时,它正常运行。
答案 0 :(得分:4)
当您将belongsTo: Community
部分添加到Member
时,您说Member
将属于Community
。
构建Member
对象时,您未提供与Community
相关联的Member
。像这样提交Member
正在爆发,因为你尚未说出它所属的Community
。
无论如何,您不需要那些save
来电,因为belongsTo
标记Community
将负责保存。取出3 m [x] .save()行,读取belongsTo
代码,看看它是否按预期工作。
答案 1 :(得分:1)
它是对象创建的顺序。 belongsTo将创建外键关系(至少在默认情况下是这样),因此您必须按照示例中显示的相反顺序创建对象(例如,Bank,Community,Member)。
您还可以更深入地了解约束和映射以更改某些默认机制。 Grails指南相当长,有时我发现它假设了一些Hibernate的先前知识,但它应该具有相当多的大部分内容(你可能必须转到“其他”和“高级”主题)。