Как сохранить сущность в двух разных таблицах, используя Spring + Hibernate - PullRequest
3 голосов
/ 05 марта 2012

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

Как мне добиться этого с помощью Hibernate?Прямо сейчас у меня есть файл Session.hbm.xml, который отображает объект Session в таблицу активных сессий.Могу ли я сопоставить его с дополнительной таблицей и каким-то образом указать, к какой таблице я хочу, чтобы она сохранялась, когда я вызываю saveOrUpdate?

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

Я могу сделать это, используя сущностьатрибут имени в файле сопоставления.Я создал второе сопоставление, идентичное Session.hbm.xml, под названием HistoricalSession.hbm.xml.В этом новом файле сопоставления я ссылаюсь на тот же класс Session, но добавляю:

entity-name="HistoricalSession"

Затем я сопоставляю объект со своей второй (исторической) таблицей, как обычно.Вызов save () или saveOrUpdate () по умолчанию использует имя класса в качестве имени объекта и сохраняет в моей основной таблице, как и раньше.Теперь, когда я хочу сохранить сеанс в хронологической таблице, я использую переопределения API Hibernate, которые позволяют вам указать имя сущности:

saveOrUpdate("HistoricalSession",session);

Это выполняет именно то, что я хочу, без необходимости создавать другую Javaкласс для исторических сессий

Ответы [ 3 ]

5 голосов
/ 06 марта 2012

Я могу сделать это, используя атрибут entity-name в файле отображения.Я создал второе сопоставление, идентичное Session.hbm.xml, под названием HistoricalSession.hbm.xml.В этом новом файле отображения я ссылаюсь на тот же класс Session, но добавляю:

entity-name="HistoricalSession"

Затем я сопоставляю объект со своей второй (исторической) таблицей, как обычно.Вызов save () или saveOrUpdate () по умолчанию использует имя класса в качестве имени объекта и сохраняет в моей основной таблице, как и раньше.Теперь, когда я хочу сохранить сеанс в хронологической таблице, я использую переопределения API Hibernate, которые позволяют вам указывать имя объекта:

saveOrUpdate("HistoricalSession",session);

Это выполняет именно то, что я хочу, без необходимости создавать другую Javaкласс для исторических сессий

1 голос
/ 05 марта 2012

Это можно сделать двумя способами:

  • Использовать триггер базы данных по истечении сеанса, когда триггер переместит строку в таблицу истории.
  • Вы можете создать HistoricalSession, расширяет сеанс, а затем выполнить второе сопоставление для HistoricalSession и написать код для удаления из сеанса и вставить в исторический сеанс.
0 голосов
/ 05 марта 2012

Ваша потребность звучит как аудит. Проверьте проект Hibernate Envers , это может помочь решить вашу проблему лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...