Временные данные с использованием NHibernate - PullRequest
3 голосов
/ 28 октября 2009

Кто-нибудь может дать несколько советов / указателей / ссылок о том, как реализовать временную таблицу состояний с помощью NHibernate? То есть каждая таблица сущностей имеет столбцы start_date и end_date , которые описывают интервал времени, в течение которого эта строка считается действительной.
Когда пользователь вставляет новую сущность, start_date получает сообщение «сейчас», а end_date будет иметь значение «ноль» (или дату в далеком будущем, я еще не решил). 1010 * При обновлении я хотел бы изменить запрос UPDATE на следующий:

  1. UPDATE end_date для строки этого объекта и
  2. ВСТАВИТЬ новую строку с текущей датой / временем и нулевой конечной датой.

Я пытался использовать прослушиватели событий, чтобы вручную написать запрос UPDATE для 1, но не могу понять, как реализовать новый запрос INSERT для 2.

Это правильный путь? Или я здесь совершенно не в себе?

Ответы [ 4 ]

2 голосов
/ 26 октября 2010

На самом деле у нас есть рабочее решение, где я работаю, но оно эффективно убивает часть механизма nhibernate.

Для «временных сущностей» NH действует только как механизм вставки / выбора. Удаление и обновление выполняются другой утилитой, где ORM-часть NH оказывается полезной.

Если у вас есть только несколько временных объектов, вы можете использовать только nhibernate, но будьте готовы написать свой собственный код, чтобы убедиться, что отношения между состояниями действительны. Мы пошли по этому пути с нашей первой попытки, и после того, как количество временных сущностей начало складываться, механизм был фактически сломан.

Теперь вставки не нуждаются в специальных инструментах, просто поместите значения в соответствующие свойства datetime, и все готово. Мы реализуем выборки с помощью фильтров (определенно проверьте 16.1 из-за ссылки NH, как это имеет пример, но условие не должно использовать BETWEEN), хотя если вы пойдете таким образом, вам придется изменить исходный код NH для применения фильтры на все виды выбора. Проверьте это сообщение на http://savale.blogspot.com/2010/01/enabling-filters-on-mapped-entities.html для этого.

Это также может сработать, если вы укажете условие «где» в отображении (вместо фильтров), но я еще не пробовал и не проверял его, и я понимаю, что отображенное «где» в отображении не параметры поддержки (по крайней мере, официально).

Как я отмечу, причина использования специального инструмента для обновлений / удалений станет ясна после прочтения книг Ричарда Снодграсса по временным базам данных http://www.cs.arizona.edu/~rts/publications.html

Чтобы напрямую ответить на ваш вопрос, будет работать как значение NULL _end, так и значение в будущем (но, предпочитая решение NOT-NULL, оно упростит ваши запросы, поскольку вам не придется проверять с ISNULL).

Для обновлений вы фактически делаете клон исходной сущности, затем устанавливаете _end исходной сущности на сейчас, а затем переходите к клонированной и меняете соответствующие свойства, меняете _start на сейчас, _end на далекое будущее значение

1 голос
/ 28 октября 2009

Я предлагаю отличный timeNarrative от Мартина Фаулера.

0 голосов
/ 14 сентября 2011

Хотя этой статье уже несколько лет, модель все еще кажется действительной. Я еще не использовал это, но мне нужно подобное решение в текущем проекте, и я буду моделировать его так, как это описано здесь .

0 голосов
/ 26 октября 2010

Я думаю, что лучший подход - иметь что-то вроде карты Java (извините, я программист на Java) и позволить NHibernate отобразить это. Карта будет отображать что-то вроде Period с полями «start» и «end», в значение. Вы можете написать UserType для отображения периода в два разных столбца базы данных

...