Метод платформы Grails addTo генерирует исключение при многократном вызове - PullRequest
0 голосов
/ 21 июля 2011

Я хочу добавить подписки в класс User, я делаю это, вызывая метод "addTo", вот мой код:

if (params.jobs == "on") {
        user.addToSubscriptions(Category.findWhere(id: 1L))
    } else {
        user.removeFromSubscriptions(Category.findWhere(id: 1L))
    }

"params" происходят из флажков, где пользователь можетподписаться на категорию, установив флажки.Код выше вызывается при отправке формы.Что не работает, так это когда пользователь меняет более 1 категории, думайте о том же коде, что и выше, с другим params.x, как это

    if (params.offers == "on") {
        Category cat = Category.get(2)
        if (!user.subscriptions.contains(cat))
        user.addToSubscriptions(Category.findWhere(id: 2L))//needs long variable
    } else {
        user.removeFromSubscriptions(Category.findWhere(id: 2L))
    }

Что также происходит, только категория, которая является первой вкод добавляется и удаляется, все остальные выдают следующее исключение:

org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update

edit: строка, в которую выдается исключение, это та, которая не имеет смысла для меня: (

edit: Исключение выдается, когда я хочу добавить категорию, которая уже добавлена, но также не удаляется (это только для категорий, которые не обрабатываются первыми в коде, не спрашивайте меня, почему)

     //reload page
    redirect(action: "userSettings")

что я могу сделать? Пожалуйста, помогите! Большое спасибо заранее! Даниэль

1 Ответ

2 голосов
/ 21 июля 2011

Возможно ли, что вы пытаетесь удалить категорию, которая не связана с пользователем?Как вы знаете ... у пользователя нет категории с id = 2, и он отправил params.offers == "off"?

Может быть, вы должны сделать что-то вроде:

if (params.jobs == "on") {
    user.addToSubscriptions(Category.findWhere(id: 1L))
} else {
    Category cat = Category.get(2L)
    if (user.subscriptions.contains(cat)) {
        user.removeFromSubscriptions(cat)
    }
}

Несколько советов: Если у вас есть идентификатор, не используйте:

Category.findWhere(id:1L) 

, но:

Category.get(1L)

Ошибка выдается на вставленной вами строке, потому что это, вероятно, последняя строка вашего контроллератаким образом, после этой строки ваша транзакция фиксируется, где выдается ошибка.

Попробуйте добавить этот код в ваш контроллер:

user.save()
user.errors?.allErrors?.each { println it }

это напечатает все ошибки, которые произошли во время сохранения.

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