在运行时将Hibernate拦截器添加到会话工厂

时间:2013-05-02 11:21:02

标签: 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);

   }
}

我想以同样的方式使用拦截器......我可以吗?

1 个答案:

答案 0 :(得分:0)

不,你不能。代替:

自己创建一个拦截器或监听器以永久添加,但您可以通过它来添加/删除委托拦截器/监听器(或以其他方式可切换地启用/或委派您的功能)。

然后,一旦你可以在运行时获得它的引用(静态单例可能是简单的方法),你可以以编程方式打开/关闭你的功能或添加/删除你的代表。

(我实际上已经做了一些与Hibernate Generators相关的事情,根据部署的数据库类型进行委托;并且它有效。)

注意:美中不足的是配置&启动;初始化事件不会轻易传递给尚未创建的委托。