场景1: 我有两个班:
发表:
class Post {
String content
Date dateCreated
static constraints = {
content(blank: false)
}
static belongsTo = [ user : User ]
}
用户:
class User {
// existing code here
static hasMany = [ posts : Post ]
}
这是一种经典的一对多关系。这些类的集成测试:
void testFirstPost() {
def user = new User(userId: 'joe',password: 'secret').save()
def post1 = new Post(content: "First post... W00t!")
user.addToPosts(post1)
def post2 = new Post(content: "Second post...")
user.addToPosts(post2) }
效果很好。但是如果你考虑其他两个类,比如:
情景2:
用户:
class User {
String login
String password
Profile profile
Status status
static hasMany = [ holidays : Holiday ]
static constraints = {
login(unique:true,size:2..20)
password(size:2..20) //more to be added later!
profile(nullable:true)
company(nullable:true)
}
static belongsTo = [ company : Company ]
}
公司:
class Company {
String shortName;
String name
Date dateCreated
String region
String email
Address address
Status status
Long tel
Long fax
static hasMany = [ users : User]
static constraints = {
}
static mapping = {
address lazy:false
status lazy:false
}
}
再次经典的一对多关系。
对于这些课程,我写了这样的测试:
void testSaveUser() {
def status1 = new Status(name:"Busy")
status1.save(flush:true)
def user = new User(login:"anto",password:"anything",
status:status1)
assert user.save(flush:true, failOnError: true)
}
即使这个测试也能正常工作。请注意,在第二个 User
类中,我已将company
字段的约束设为company(nullable:true)
,如果我没有将其置于上述测试({{ 1}})失败!
我得到的错误是:
testSaveUser()
即使场景1 和场景2 都相同,为什么场景2 会强制我添加{{1}约束?
(请注意,我正在使用 Grails 1.3.7 并在同一版本中运行两个方案!)
提前致谢。
答案 0 :(得分:1)
如果belongsTo
有其他内容,则默认情况下不能为null
在您的测试中,您没有(仍)在company
之前为用户设置save
,因此默认约束会失败