问题是我有一个类似于以下的休眠拦截器:

public class CustomInterceptor extends EmptyInterceptor {

    private String tenant;

    public CustomInterceptor(String tenant) {
        this.tenant = tenant;
    }

   @Override
   public String onPrepareStatement(String sql) {
        String prepedStatement = super.onPrepareStatement(sql);
        if (tenant != null) {
            prepedStatement = prepedStatement.replaceAll("TABLE_NAME_1", "TABLE_" + tenant);
        }
        return prepedStatement;
    }  }


我可以在启动上述拦截器期间进行初始化,但是我想要的是能够向不同的租户注册相同的拦截器,就像Spring拦截器所允许的那样,如下所示:

registry.addInterceptor(new CustomInterceptor("tenant1")).addPathPatterns("/wow/tenant1");

registry.addInterceptor(new CustomInterceptor("tenant2")).addPathPatterns("/wow/tenant2");

registry.addInterceptor(new CustomInterceptor("tenant3")).addPathPatterns("/wow/tenant3");


我无法在Hibernate中进行多个拦截器的注册,并且我无法使用Spring Interceptor,因为在我的情况下Spring Interceptor无法提供Hibernate Interceptor的功能(即onPrepareStatement能够在运行时更改表名)。

任何人都可以建议如何在Hibernate中注册多个拦截器吗?我不确定Hibernate是否有可能。

编辑:

回答(基于我的研究和实施):
在启动时注册多个拦截器,然后根据传入的请求模式将其定向到不同的拦截器,这是Spring提供的,Hibernate不支持。

最佳答案

您可以引入一个InterceptorProxy来保存CustomInterceptor的列表。

public class InterceptorProxy extends EmptyInterceptor {

    private List<CustomInterceptor> interceptors;

    public InterceptorProxy (List<CustomInterceptor>) {
        this.interceptors = interceptors;
    }

   @Override
   public String onPrepareStatement(String sql) {
        String prepedStatement = super.onPrepareStatement(sql);
        for (CustomInterceptor ci:interceptors) {
             //your logic here
        }
        return prepedStatement;
    }
}

关于java - 是否可以多次注册单个 hibernate 拦截器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48315630/

10-13 22:58