Сценарий 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 ]
}
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)
, если я не поставил это выше, вышеприведенный тест (testSaveUser()
) не пройден !.
Я получаю следующую ошибку:
Validation Error(s) occurred during save(): - Field error in object 'mnm.User' on field 'company': rejected value [null]; codes [mnm.User.company.nullable.error.mnm.User.company,mnm.User.company.nullable.error.company,mnm.User.company.nullable.error.mnm.Company,mnm.User.company.nullable.error,user.company.nullable.error.mnm.User.company,user.company.nullable.error.company,user.company.nullable.error.mnm.Company,user.company.nullable.error,mnm.User.company.nullable.mnm.User.company,mnm.User.company.nullable.company,mnm.User.company.nullable.mnm.Company,mnm.User.company.nullable,user.company.nullable.mnm.User.company,user.company.nullable.company,user.company.nullable.mnm.Company,user.company.nullable,nullable.mnm.User.company,nullable.company,nullable.mnm.Company,nullable]; arguments [company,class mnm.User]; default message [Property [{0}] of class [{1}] cannot be null]
grails.validation.ValidationException: Validation Error(s) occurred during save():
- Field error in object 'mnm.User' on field 'company': rejected value [null]; codes [mnm.User.company.nullable.error.mnm.User.company,mnm.User.company.nullable.error.company,mnm.User.company.nullable.error.mnm.Company,mnm.User.company.nullable.error,user.company.nullable.error.mnm.User.company,user.company.nullable.error.company,user.company.nullable.error.mnm.Company,user.company.nullable.error,mnm.User.company.nullable.mnm.User.company,mnm.User.company.nullable.company,mnm.User.company.nullable.mnm.Company,mnm.User.company.nullable,user.company.nullable.mnm.User.company,user.company.nullable.company,user.company.nullable.mnm.Company,user.company.nullable,nullable.mnm.User.company,nullable.company,nullable.mnm.Company,nullable]; arguments [company,class mnm.User]; default message [Property [{0}] of class [{1}] cannot be null]
at mnm.UserIntegrationTests.testSaveUser(UserIntegrationTests.groovy:18)
Несмотря на то, что оба Сценарий 1 и Сценарий 2 одинаковы, почему Сценарий 2 заставляет меня добавить ограничение company(nullable:true)
?
(Обратите внимание, что я использую Grails 1.3.7 и запускаю два сценария в одном и том жеверсия!.)
Заранее спасибо.