Мое приложение использует Hibernate-Envers 4.3.11
- Я загружаю музыкальные файлы в свою базу данных с их метаданными (например, названием альбома, исполнителем), представленными как проверенная Песня класс
- Затем приложение редактирует метаданные по-разному и записывает обратно в класс Song (каждый раз, когда зафиксированный сеанс создает новую ревизию)
- Затем обычно в конце изменения записываются из текущего класса Song обратно в сам файл.
- Но при работе в Режим предварительного просмотра в файл ничего не записывается. Поэтому я хочу, чтобы последняя версия класса Song для этого файла теперь содержала те же метаданные, что и версия, созданная при первоначальной загрузке файла.
В настоящее время я делаю это, получая первую ревизию песни и копируя данные, которые она содержит, в последнюю версию песни. но есть ли способ, которым я могу просто сказать: возьми эту более раннюю ревизию и сделай ее самой последней ревизией .
Обновление
Я сейчас реализую ответ Нароса. Так что теперь у меня есть класс с именем SongFile , который всегда представляет содержимое музыкального файла на диске, это @Audited (от Envers), а основным идентификатором является @ GeneratedValue.
Затем у нас есть класс с именем Song , после создания и пропуска сущности SongFile мы создаем эквивалентную сущность Song . Это не проверяется, и основной идентификатор устанавливается вручную, мы устанавливаем primaryId и все метаданные так же, как класс Song.
Затем приложение изменяет метаданные на Песня .
Затем в заключение, если в режиме предварительного просмотра , мы просто сравниваем различия между Song и SongFile и генерируем отчет.
Если в режиме Реальное сохранение мы сравниваем различия между Song и SongFile и генерируем отчет и сохраняем изменения обратно в файл, а SongFile .
Это прекрасно работает и решает ряд проблем.
Однако у меня есть проблема, в музыкальных файлах также могут храниться несколько изображений (в формате JPEG и т. Д.), Мы моделируем их с помощью класса CoverImage , представляющего изображение, и класса CoverArt , который обеспечивает 1: M связь между Song и CoverImage , также хранит атрибут имени.
Теперь проблема в том, что я создал класс CoverArtFile , используемый SongFile , который использует @GeneratedValue и класс CoverArt , используемый Song это не аутоген.
При первоначальной загрузке файла и создании SongFile и Song это работает нормально, копируя автоматически сгенерированное значение из любых CoverArtFile
классов в CoverArt class
Однако, если у нас нет coverart для начала, а затем он добавляется приложением, мы терпим неудачу, потому что класс CoverArt не генерирует первичный ключ автоматически, и я не могу безопасно сгенерировать его в случае, если он используется существующий класс CoverArtFile (или будет в будущем).
Если в качестве альтернативы у меня есть CoverArt, использующее автогенерируемое значение, тогда оно не будет таким же, как в связанном с ним классе CoverArtFile.
Как мне поступить?