2015-09-08 9 views
0

мое приложение работает нормально. Но теперь клиент хочет отменить изменения. Уже сделанные транзакции базы данных должны быть отменены.Hibernate Envers undo

Поэтому я настроил Envers и позволил два свойства

необходимых
<property name="org.hibernate.envers.track_entities_changed_in_revision">true</property> 
    <property name="org.hibernate.envers.global_with_modified_flag">true</property> 

Аудиторских таблицы создаются и заполняются автоматически. Теперь мой слушатель (CTRL + Z) выполняет следующий отрезал

public void run() { 

    if (SystemDatabaseManager.isInitialized()) { 

     if (AppHelper.showQuestion(Display.getCurrent().getActiveShell(), "undo?") == SWT.YES) { 

      Session session = null; 

      try { 

       session = SystemDatabaseManager.getCurrentSession(); 

       AuditReader reader = AuditReaderFactory.get(session); 

       final Number revision = reader.getRevisionNumberForDate(new Date(Long.MAX_VALUE)); 

       List<Object> test = reader.getCrossTypeRevisionChangesReader().findEntities(revision); 

       session.beginTransaction(); 
       for(Object object: test) { 

        session.merge(object); 

       } 
       SystemDatabaseManager.commit(session); 

      } catch (Exception e) { 
       SystemDatabaseManager.rollback(session); 
      } 

     } 

    } 

} 

Теперь проблема сливая старое состояние объекта Выдает исключение

«Удаленный объект whould быть повторно сохранен ...»

Я знаю это исключение и то, что он обозначает, но я не знаю, как его решить таким образом.

Большая проблема заключается в том, что изменяются не только примитивные поля. Также меняются отношения.

Есть ли какие-либо решения для моей проблемы?

ответ

0

Самый простой способ сделать это с помощью SQL. Таблицы аудита структурно совпадают с обычными таблицами, за исключением некоторых дополнительных данных (версия, дата, время и т. Д.). Просто переписать запись в обычной таблице с записью в таблице аудита сделало бы трюк. Все отношения и связанные с ними объекты будут иметь соответствующую запись в той же версии, поэтому их также следует скопировать.

Что означает клиент, когда они хотят отменить изменение?

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

  • Хотите ли они перемотать систему в предыдущее состояние (стереть последующие записи аудита)? Теперь вам придется удалить некоторые записи из таблиц аудита, а также из таблицы ревизий.

Последнее решение сохраняется только при удалении всей версии после определенного номера версии.

Смежные вопросы