Как создать функцию отмены в веб-приложении на основе Spring MVC?

У меня есть сотрудник и соответствующая таблица истории сотрудников.

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

Теперь мне нужно добавить функцию отмены к изменениям, внесенным в сотрудника.

например Название сотрудника изменено 1 августа. Теперь это обновит заголовок сотрудников в таблице Employee и вставит соответствующую запись истории в таблицу employee_history.

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

Нажатие на «Отменить» должно вернуть изменения в таблице «Сотрудник» к предыдущему значению. Также я думаю, что запись в таблице истории, в которой говорится, что название изменено, также должна быть удалена.

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

Я не уверен, как лучше всего это сделать.

Любые предложения будут полезны.


person ashishjmeshram    schedule 01.08.2012    source источник
comment
Я знаю, что вы ищете что-то конкретное, но подумайте об использовании шаблона команд в своем дизайне - одно из преимуществ инкапсуляции изменений, как и в случае с многоуровневой отменой.   -  person Rob I    schedule 01.08.2012
comment
Это сильно зависит от фреймворка пользовательского интерфейса.   -  person kostja    schedule 01.08.2012
comment
@kostja. Это весеннее веб-приложение на основе MVC.   -  person ashishjmeshram    schedule 01.08.2012
comment
возможный дубликат Как спроектировать отмену и повтор в текстовом редакторе?   -  person slayton    schedule 01.08.2012
comment
@slayton. Речь идет не больше о проектировании отмены, а о том, как управлять обновлениями таблиц истории.   -  person ashishjmeshram    schedule 01.08.2012


Ответы (3)


В случае, если вы хотите реализовать «постоянную» отмену - ту, которая переживет перезапуск приложения / тайм-аут сеанса, вам следует рассмотреть возможность увеличения ширины timestamp полей схемы БД и либо удалить последнюю запись, либо заменить ее соответствующей более ранней записью.

«Облегченная» версия будет использовать стек для хранения последних взаимодействий, включая исходное и новое значение. Конечно, вы можете сохранить стек при аннулировании сеанса, чтобы объединить оба подхода. Кажется, это то, что вы на самом деле делаете.

Вы можете расширить это решение, создав и сохраняя или экспортируя сценарии миграции SQL для каждого изменения, записывая изменение и, если возможно, противоположное действие. Таким образом, вы даже можете передавать сценарии между экземплярами приложений и средами и иметь полную «воспроизводимость» состояний вашей БД.

tl; dr - похоже, вы уже реализовали хорошее решение

person kostja    schedule 01.08.2012

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

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

person Najzero    schedule 01.08.2012

Возможно, вы могли бы использовать функцию отката транзакции.

person ricardoespsanto    schedule 01.08.2012