Есть ли способ наблюдать изменения в таблице базы данных через Hibernate? - PullRequest
3 голосов
/ 12 ноября 2009

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

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

Ответы [ 4 ]

7 голосов
/ 12 ноября 2009

Hibernate не будет получать уведомления об изменениях, сделанных на уровне таблицы. (Плохое) решение заключается в обновлении данных через API Hibernate и использовании одного из обратных вызовов, предоставляемых Interceptor , для создания некоторой черной магии вуду с Singleton. Но, честно говоря, (правильный) способ справиться с этим - избавиться от этого синглтона и поместить данные в кеш 2-го уровня (и сделать кеш недействительным, если вы обновите таблицу вручную).

(РЕДАКТИРОВАТЬ: как ChssPly76 упомянул в комментарии, существует промежуточное решение, если удаление синглтона не является опцией, которая заключается в изменении синглтона для поиска и возврата кэшированных объектов, управляемых в спящем режиме, например, ваших стран.)

1 голос
/ 12 ноября 2009

Ваша ситуация звучит идеально для L2-кэша , поскольку ваши объекты редко меняются и соответственно устанавливают политику удаления для обновления. Кроме того, если моды ALL выполняются через Hibernate, вы можете отслеживать, что происходит через инфраструктуру events / interceptor . Конечно, любые вспомогательные таблицы, о которых Hibernate не знает, должны отслеживаться другими способами, например, как предложено @BalusC.

1 голос
/ 12 ноября 2009

Реализация Interceptor#onFlushDirty(). Ах нет, вы хотите сделать это с другой стороны. Нет, это невозможно. Лучшее, что вы можете сделать, это перезагрузить данные через определенные интервалы, например, один раз в час. Для этого вы можете использовать java.util.TimerTask.

Тем не менее, Singleton действительно плохая идея. Просто имейте это как своего рода атрибут основного контекста. Если это, например, веб-приложение Java EE, вы можете использовать для этого ServletContext.

0 голосов
/ 12 ноября 2009

Кажется, что самый простой подход к этому - это триггер на стороне базы данных, а не внутри вашего приложения. Но это, конечно, зависит от базовой базы данных и от того, действительно ли вы хотите использовать SQL, если все остальное выполняется Hibernate.

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