Почему GORM выполняет каскадное удаление, даже если я опускаю ключевое слово assignTo? - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть следующие классы доменов:

Праздник :

class Holiday {
    String justification
    User user
    //static belongsTo = User
        static constraints = {
        }
}

Пользователь :

class User {
    String login
    String password
    static hasMany = [ holidays : Holiday ]
        static constraints = {
    }
}

Я создал отношения один-много между Holiday и User.Обратите внимание, что я не включил belongsTo в класс Holiday.Теперь я написал следующий интеграционный тест:

void testWithoutBelongsTo() {       
        def user1 = new User(login:"anto", password:"secret")
        user1.save()
        def holiday1 = new Holiday(justification:"went to trip")
        holiday1.save()
        user1.addToHolidays(holiday1)
        assertEquals 1, User.get(user1.id).holidays.size()
        user1.delete()
        assertFalse User.exists(user1.id)
        assertFalse Holiday.exists(holiday1.id)
    }

Ясно, что в приведенном выше тестовом примере я удаляю только экземпляр user1, но когда я запускаю операторы assert, я вижу, что GORM неявноудалено holiday1 тоже.И мои тестовые случаи имеют PASSED !Как это может произойти, даже если я не указал ключевое слово belongsTo в классе Holiday?

Я использую Grails версии 1.3.7.

Ответы [ 2 ]

3 голосов
/ 02 декабря 2011

holiday1 никогда не сохранялся, так как не проверял: свойство user не установлено и не может быть обнулено.

Вот как должен выглядеть ваш код в Holiday.groovy:

class Holiday {
    String justification
    User user
    //static belongsTo = User
    static constraints = {
        user(nullable: true)
    }
}

И ваш тест со свойством user, правильно установленным в holiday1:

void testWithoutBelongsTo()
{
    def user1 = new User(login:"anto", password:"secret")
    user1.save(failOnError: true)
    def holiday1 = new Holiday(justification:"went to trip", 
                               user: user1) // Set user properly
    holiday1.save(failOnError: true)
    user1.addToHolidays(holiday1)
    assert 1, User.get(user1.id).holidays.size()
    holiday1.user = null  // Unset user as otherwise your DB
                          // won't be happy (foreign key missing)
    user1.delete()
    assert ! User.exists(user1.id)
    assert Holiday.exists(holiday1.id)
 }

Чтобы быстро устранить ошибки проверки в ваших тестах, всегда используйте save(failOnError: true).Он выдаст исключение, если ваш объект не будет проверен.

0 голосов
/ 02 декабря 2011

Вы должны сохранить праздник после добавления его к пользователю.

...