среда, 26 октября 2011 г.

Автоматический update, выполняемый hibernate

Сегодня столкнулся со следующей проблемой в j2ee приложении, использующем jpa (hibernate):
Обычный поисковый select-запрос, реализованный с помощью Criteria API, после своего выполнения отсылал update-запрос базе. В большинстве случаев в этом не было ничего критичного, ну разве что перфоманс слегка страдал. Вот никто и не замечал... Сегодня же select выполнялся ко view, поэтому следующий за ним update вызвал ошибку.
Caused by: java.sql.SQLSyntaxErrorException: ORA-01031: insufficient privileges
Caused by: org.hibernate.exception.SQLGrammarException: could not update
Объяснение эффекта достаточно простым оказалось, но тем не менее.Всё работает абсолютно так, как должно быть: в классе был метод @PostLoad, проверяющий определённые строковые поля на null и заменяющий их на пустые строки. После окончания работы с данными Hibernate проверял объект, видел изменения и считал необходимым сделать аналогичные изменения в БД. Отсюда и update, отсюда и ошибка шла. Ещё чаще подобные "нежелательные" апдейты встречаются, когда orm работает через методы-аксессоры, а не через поля, а программисты спасаются от NullPointerException, делая вот такие getter'ы:
public String getStr() {
    return str == null ? "" : str;
}
Вообще, любые изменения приводят к такому вот эффекту... Например замена "Ё" на "Е", поэтому надо помнить об этой особенности.

Комментариев нет:

Отправить комментарий