Откат изменений на объект, если недействительный - PullRequest
1 голос
/ 09 июня 2010

Как мне откатить изменения в прикрепленном объекте в nhibernate? У нас есть проверка перед обновлением / сохранением (пример упрощен) ..

var setting = Get("key")
setting.Value = "helo" //for whatever reason, this particular 
                       //setting cannot have its value saved to the database
...
Verify(setting);       //throws
base.Update(setting);

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

1 Ответ

2 голосов
/ 09 июня 2010

Скорее всего, это , поскольку окружающая транзакция совершает , даже генерируется исключение.Или вы перехватываете исключение позже и скрываете ошибку от окружающей транзакции. Обновление может выполняться NH всякий раз, когда он сбрасывает сеанс , например, перед выполнением запросов.Фиксация всегда синхронизирует состояние памяти с базой данных.

Обновление необходимо только для экземпляров, которые еще не находятся в сеансе (но в базе данных).Все в сеансе синхронизируется с базой данных, в любой момент времени, самое позднее при фиксации.

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

Так, что это все означает для вашего кода?

  • Напишите свой код, как если бы не было NHibernate или постоянство .Это также повысит удобство обслуживания и тестируемость.
  • То, что вы делаете в памяти, является окончательным .У вас нет второго «магазина» шаг.Не делайте того, чего не хотите.
  • Ваша память должна быть такой же согласованной, как и база данных .Ваша логика всегда основана на состоянии памяти (например, вычисления).Несогласованная память нарушит целостность приложения.Поэтому вам не следует фиксировать, когда в базе данных есть данные, которые вам не нужны.
  • Фиксация - это все или ничего .Либо вы довольны своими изменениями, либо откатываете все.
  • Обработка исключений - сложная задача .Не всегда легко решить, можете ли вы продолжить транзакцию.
  • Изменение состояния объекта является обязанностью вашей бизнес-логики .NHibernate не будет «сбрасывать» ни одного экземпляра.(Существует Refresh, но он не будет работать здесь, и вы все равно не должны его использовать).Поэтому, если вы хотите сбросить значение, вам нужно написать бизнес-логику, которая сбрасывает значение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...