在运行时将Hibernate侦听器添加到会话工厂

在运行时将Hibernate侦听器添加到会话工厂,hibernate,Hibernate,我希望在运行时向会话或会话工厂添加拦截器。 我设法用事件处理程序执行了类似的操作: @Component public class HibernateEventListenersRegisterer { /** The post load event listener. */ @Resource private GenericPostLoadEventListener postLoadEventListener; /** The session factory. */

我希望在运行时向会话或会话工厂添加拦截器。 我设法用事件处理程序执行了类似的操作:

@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);

   }
}

我想用同样的方法使用拦截器。。。我可以吗?

不,你不能。相反:

您自己创建一个拦截器或侦听器,以便永久添加,但您可以访问该拦截器或侦听器来添加/删除代理拦截器/侦听器(或以其他方式切换启用/或委托您的功能)

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

(实际上,我已经做了一些与Hibernate生成器相关的工作,根据部署的数据库类型进行委派;并且它工作正常。)


注:这里的美中不足之处在于配置和启动;初始化事件不会轻易传递给尚未创建的代理。

我在问题中使用事件侦听器发布的代码运行良好。问题是我现在需要一个拦截器。我不明白你建议如何激活拦截器。定义你的自定义拦截器,通过“静态单例”(最简单)或某种注册表访问它,然后你可以控制它;通过打开/关闭或添加/删除委托拦截器。没有办法通过Hibernate配置传入对象引用,因此要么是静态引用--MyInterceptor.getInstance()--要么你的拦截器可以注册并从JNDI或任何其他你可以使用的注册表中找到。对不起。。。我还是不明白你的建议。我有一个拦截器。好的现在,如何将其连接到会话工厂?这是我的问题。如果我不以某种方式将其连接到会话,它将不会拦截任何内容。我不明白我的问题和静态或单例之间有什么联系。我有一个拦截器——它是spring作为单例管理的。我的建议是在配置时将拦截器连接到SessionFactory,然后(通过静态引用或其他方式访问)打开/关闭行为或更改附加的代理拦截器。WrapperInterceptor.getInstance().addDelegate(新的MyActualLogic_Interceptor());