Grails: обновление строки базы данных происходит молча, когда в доменном классе содержится «версия false» - PullRequest
0 голосов
/ 26 сентября 2018

Я использую Grails v3.2.9

У меня есть класс домена Offer, содержащий

static mapping = {
    version false
}

Я вставляю строку в таблицу offer, затем в другую транзакциюЯ пытаюсь обновить значение одного столбца внутри этой строки, но offer обновить молча не удается, в то время как другие объекты в той же транзакции обновляются должным образом.

Я сохраняю offer следующим образом:

offer.save(failOnError: true)

, поэтому это не относится к offer.save(), когда проверка завершается неудачно, а сохранение завершается неудачно.

Однакоесли я добавлю столбец version в таблицу offer (dbCreate установлен на none) и изменит класс домена Offer на

static mapping = {
    version true
}

, строка начнет успешно обновляться.

При проверке таблицы audit_log для offer присутствуют только события вставки, никакого события update не происходит.

Это очень странно, так как у меня есть другие классы доменасодержащий version = false и обновление там работает нормально.

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Также возможно, что когда вы изменили домен, для которого требовалась версия, на домен, который не требует версии, базовая таблица базы данных не удалила этот столбец.

По умолчанию столбец версии создается как NOT NULL в физической базе данных.Даже если hibernate не заботится о свойстве version в домене, физическая база данных не позволит вставить эту запись и, следовательно, произойдет сбой.

Хотя это объясняет, почему запись не вставлена, это не такобъясните, почему это не выдает ошибку.Он не должен молча завершаться сбоем и вместо этого генерировать исключение SQL.

0 голосов
/ 27 сентября 2018

Поскольку version = false, свойство Offer.version равно нулю, и столбец не существует в базе данных.Обычно при выполнении обновлений Hibernate автоматически проверяет свойство версии по столбцу версии в базе данных.Итак, я просто предполагаю, что это может быть ошибкой при попытке спящего сеанса проверить значение, равное нулю.Я пытался повторить ваш сценарий, но мне это не удалось.

Вы пытались очистить сеанс при сохранении?:

offer.save(flush: true, failOnError: true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...