2013-05-02 71 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

在我的問題中,我用事件偵聽器發佈的代碼運行良好。問題是我現在需要一個攔截器。我不明白你如何建議激活攔截器。 – 2013-05-02 12:08:38

+0

定義您的自定義攔截器,通過「靜態單例」(最簡單)或者某種類型的註冊表訪問它,然後您可以控制它;可以通過開啓/關閉或添加/刪除代理攔截器。 – 2013-05-03 01:00:30

+0

有沒有辦法通過Hibernate配置傳遞對象引用,所以要麼是靜態引用 - MyInterceptor.getInstance(),要麼你的攔截器可以註冊,並且可以從JNDI或任何其他註冊表中找到工作。 – 2013-05-03 01:02:33