Реализация решения для истории данных / управления версиями для приложения на основе Hibernate (с изюминкой)
Сначала основные факты: Java веб-приложение, Spring, Hibernate, MySQL.
Ситуация такова, что у меня есть сложная объектная модель, например, автомобиль. Он состоит из множества объектов (Engine, Tyres, ...) с отношениями "многие-к-одному" и "один-ко-многим" между ними.
Сейчас существует много автомобилей, и время от времени кто-то осматривает автомобиль и создает отчет о проверке. Отчет относится ко многим частям автомобиля, отображает их свойства и т. Д.
До сих пор система не поддерживала возможность обновлять свойства автомобиля и его частей после того, как они были загружены в систему. Это означает, что если цвет шасси или количество шин были изменены, старые отчеты будут отражать это изменение, а не то, что мы хотим.
Ну, теперь эта функция была запрошена. Автомобили и их части должны быть модифицируемыми, и должна быть создана история версий. Старые отчеты должны ссылаться на старые версии частей и их значения.
Я смотрю на " Медленно меняющиеся размеры", и кажется, что управление версиями автомобиля и его частей может быть выполнено с использованием подхода типа 6.
Вот что (изюминка), с которой мне трудно разобраться (возможно, из-за моего ограниченного опыта Hibernate):
Как собрать экземпляры отчетов в Hibernate, чтобы они ссылались на правильные версии каждой части автомобиля? В отчетах указана дата, и каждая версия автомобильных деталей будет иметь диапазоны дат, когда они были действительны, поэтому, я думаю, я мог бы сделать это с некоторым сложным HQL/SQL. Но есть ли более простой, более автоматический способ сделать это с помощью Hibernate?
3 ответа
Я использовал подход, предложенный вами (Тип 6) с Hibernate, и он отлично работал для меня. Запросы к отчетам стали немного сложнее, но не намного, так как для всех запросов требовалось одно и то же предложение (например, 'и:reportTime >= x.startTime и (:reportTime Я создал интерфейс и базовый класс (интерфейс был необходим только для временных подклассов, родительские элементы которых не были временными) для объектов, которые поддерживали этот подход с двумя свойствами (например, startTime и endTime), и базовый класс для DAO, работающих с временными объектами, которые была некоторая функциональность, часто необходимая. Вещи, которые я положил в эту базу DAO: Единственная часть, где я нашел это действительно грязным, работала с простыми SQL-запросами, также работающими с базой данных, где дополнительные предложения были необходимы для объединенных таблиц или в подвыборах.
Вы можете взглянуть на JBoss envers для создания версий ваших объектов. Я не уверен, что он подходит для вашего использования, но посмотрите.
MySQL поддерживает триггеры. Настройте триггер так, чтобы при каждом изменении строки триггер копировал строку в "архивную" таблицу вместе с отметкой времени. Таким образом, сохраняются все предыдущие версии данных, с которыми можно запускать отчеты.