Почему Hibernate запускает onFlushDirty дважды? - PullRequest
0 голосов
/ 09 июля 2010

В последнее время я часто использую фреймворк Castle ActiveRecord, и он работал нормально, пока не обнаружил какое-то странное поведение: onFlushDirty запускается дважды в некоторых ситуациях.Это даже срабатывает, когда я делаю простой запрос.Я действительно сбит с толку, потому что я пытаюсь создать данные аудита в onFlushDirty, и когда я читаю данные, они запускаются, что заставляет их сохранять идентичные данные.

Как мне избежать этого поведения?

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

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

Я также столкнулся с ситуацией, когда Hibernate несколько раз сбрасывает сессию перед фиксацией, что приводит к тому, что любая логика в onFlushDirty запускается больше раз, чем я хотел.Это происходило потому, что когда для сеанса установлено значение FlushMode.AUTO, сеанс сбрасывается перед извлечением, чтобы включить недавние незафиксированные изменения.Это по замыслу , поэтому я начал коммитить сразу после внесения изменений для проверки.

0 голосов
/ 13 июля 2010

Я думаю, что решил свою проблему, но я не знаю, почему это происходит.

Прежде всего, данные, которые у меня есть в базе данных, имеют нулевые значения в некоторых полях даты и целочисленных полях (данные получены в результате миграции из Btrieve).

Когда я загружал данные вСетка данных событие onFlushDirty сработало, когда я отладил и посмотрел данные, которые я увидел, что в поле даты с нулевым значением оно имело значение previousState с нулевым значением и currentState с '0001-01-01 00:00:00'.Я изменил в базе данных значения NULL на «0001-01-01 00:00:00» в случае полей даты и ноль для целочисленных полей, и событие onFlushDirty больше никогда не вызывалось при загрузке данных в сетку данных.

Но вопрос все еще остается.Почему это происходит или это правильное поведение?

...