2013-05-02 1 views
0

Я хочу добавить перехватчик на сеанс или фабрику сеансов во время выполнения. мне удалось сделать что-то подобное с обработчиков событий:Добавить перехватчик Hibernate на заводе-изготовителе во время выполнения

@Component 
public class HibernateEventListenersRegisterer { 
    /** The post load event listener. */ 
    @Resource 
    private GenericPostLoadEventListener postLoadEventListener; 

    /** The session factory. */ 
    @Resource 
    private SessionFactory sessionFactory; 


    /** 
    * Register all event listeners. 
    */ 
    @PostConstruct 
    public void registerEventListeners() { 
    EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory).getServiceRegistry() 
        .getService(EventListenerRegistry.class); 

    registry.getEventListenerGroup(EventType.POST_LOAD).appendListener(postLoadEventListener); 

    } 
} 

Я хочу использовать перехватчик точно так же ... я могу?

ответ

0

Нет, вы не можете. Вместо этого:

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

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

(. Я на самом деле сделал что-то связанное с генераторами Hibernate, делегируя в соответствии с развернутого типа базы данных, и он работал)

Примечание: дегтя в бочке меда здесь, является конфигурация & запуска; события инициализации не будут легко переданы делегатам, которые еще не созданы.

+0

Код, который я опубликовал с прослушивателями событий по моему вопросу, работает хорошо. Проблема в том, что мне теперь нужен перехватчик. Я не понимаю, как вы предлагаете активировать перехватчик. –

+0

Определите свой пользовательский Interceptor, получите доступ к нему через «статический одноэлементный» (простейший) или, возможно, какой-то реестр, тогда вы можете его контролировать; либо путем включения/выключения, либо добавления/удаления делегатов-перехватчиков. –

+0

Невозможно передать ссылки на объекты через конфигурацию Hibernate, так что либо она станет статической ссылкой - MyInterceptor.getInstance() - или ваш перехватчик может зарегистрироваться и быть найденным из JNDI или любого другого реестра, который вы можете сделать Работа. –