2017-02-23 125 views
0

Я собираюсь приступить к реализации следующего соотношения:Данные, которые изменяются с течением времени в Hibernate

Entity one-to-many Configuration 

Но Configuration будет развиваться с течением времени, в том числе создания будущих Configuration с, то есть следующие поля в configuration таблица:

entityId 
fromDate 
toDate 
configurationValue1 
configurationValue2 
... 

fromDate и toDate магазин дата, когда конкретная версия информации активна.

Конечная запись в таблице configuration будет иметь ее fromDate и очень удаленную toDate. Добавление нового Configuration до того, как toDate обновит текущую последнюю конфигурацию, чтобы иметь toDate за день до того, как новая конфигурация fromDate, а новый Configuration - toDate будет значением в будущем.

Все это кажется хорошим случае для хорошо определены и проверены DAO возможность получить все Configuration сек для Entity, текущий Configuration в течение Entity и обновлять будущее Configuration s (гарантирующего отсутствие дублирования дат конечно), но прежде чем я начну его реализовывать, есть ли что-нибудь в Hibernate, которое могло бы помочь, например, в коде, который мог бы позволить мне это сделать? :

myEntity.getCurrentConfiguration() //perhaps a @Where that uses now() to find the correct Configuration? 

Я знаю Hibernate Envers, но я не думаю, что это обязательно правильное использование случае для него. Кажется, что Envers управляет журналами аудита, прозрачно сохраняя историю изменений, сделанных для объекта, тогда как я хочу иметь возможность управлять текущими и будущими значениями объекта, при этом текущее значение основывается на now() (однако мне нужно способный хранить все старые записи).

+0

Вы можете использовать формулы Hibernate или виды базы данных для этого; см. [этот ответ] (http://stackoverflow.com/a/32027714/4754790). Однако оба будут означать, что соединения между 'Entity' и' Configuration' выполняются всякий раз, когда вы читаете 'Entity', поэтому вам может потребоваться просто выполнить дополнительный запрос, чтобы получить текущую конфигурацию, когда вам это нужно, без сопоставления ее в' Entity' вообще. –

ответ

0

Что абсолютно верно, Hibernate Envers не соответствует требованиям, изложенным вами.

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

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

+0

Спасибо за подтверждение этого - предложенный вами подход - именно тот подход, который я уже выбрал: класс Util, который может манипулировать TreeSet существующих объектов, которые должны реализовать конкретный метод. Используя интерфейс, я могу использовать технику в любом месте, а Hibernate примет изменения. – Rich