принадлежит по-разному в каждом сценарии - PullRequest
1 голос
/ 05 декабря 2011

Сценарий 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 и запускаю два сценария в одном и том жеверсия!.)

Заранее спасибо.

1 Ответ

1 голос
/ 05 декабря 2011

Если что-то belongsTo что-то еще, по умолчанию это не может быть null

. В своем тесте вы (все еще) не устанавливаете company для пользователя, прежде чем save это,так что это не удастся с ограничением по умолчанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...