Как отделить модуль, который прослушивает событие гибернации, от самих сущностей? - PullRequest
3 голосов
/ 24 января 2012

У меня есть многоуровневое веб-приложение, работающее на основе spring-jpa-hibernate, и я сейчас пытаюсь интегрироватьasticsearch (поисковик).

Что я хочу сделать, так это перехватить все события postInsert / postUpdate и отправить эти сущности вasticsearch, чтобы он переиндексировал их.

Проблема, с которой я сталкиваюсь, заключается в том, что мой проект "dal-entity" будет иметь зависимость во время выполнения от "search-indexer", а "search-indexer" будет зависеть от компиляции "dal-entity"«так как он должен делать разные вещи для разных лиц.

Я думал о том, чтобы иметь «поисковый индексатор» как часть DAL (поскольку можно утверждать, что он выполняет операции с данными), но даже при этом он должен быть частью раздела DAO.

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

Обновление
Причина, по которой проект dal-entity зависит от индексатора, заключается в том, что мне нужно настроить прослушиватель в файле конфигурации Spring, который отвечает за контекст jpa (который явно находится в dal-entity).
Зависимость - это не область времени компиляции, а область времени выполнения (поскольку во время выполнения этому прослушивателю понадобится контекст hibernate).

Ответы [ 2 ]

1 голос
/ 24 января 2012

Ответ - Интерфейсы.

Вместо того, чтобы зависеть от различных классов напрямую (в любом направлении), вы можете вместо этого зависеть от интерфейсов, которые предоставляют необходимые вам возможности. Таким образом, вы не напрямую зависимы от классов, но вместо этого зависите от интерфейса, и вы можете иметь интерфейсы, требуемые для "dal-entity", например, жить в том же пакете, что и dal -entities и индексатор просто реализует этот интерфейс.

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

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

0 голосов
/ 24 января 2012

Hibernate поддерживает PostUpdateEventListener и PostInsertEventListener.

Вот хороший пример , который может подойти для вашего случая

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

public class ElasticSearchListener implements PostUpdateEventListener {

@Override
public void onPostUpdate(PostUpdateEvent event) {
    if (event.getEntity() instanceof ElasticSearchEntity ) {
        callSearchIndexerService(event.getEntity());
        Or 
        InjectedClass.act(event.getEntity());
        Or 
        callWebService(InjectedClassUtility.modifyData(event.getEntity()));

      ........
}
}

Edit

Вы можете рассмотреть возможность внедрения класса, который вы хотите изолировать от проекта (который содержит логику), с помощью Spring.

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

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