在获得连接之前,自动更改上下文上下文

发布于 2025-01-19 07:46:42 字数 1380 浏览 1 评论 0原文

我正在使用 Spring 多租户框架,并且尝试根据每个实体类中的属性设置 TenanContext。 我使用的拦截器不会在每次事务之前设置TenantSelector,并且我没有找到任何方法来实现它(onLoad在应用程序加载期间而不是之前执行所有操作每笔交易)。我正在尝试来自 org.hibernate.EmptyInterceptor 的其他拦截器,但任何拦截器都可以满足我的需要。

这是我使用的拦截器:

LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setEntityInterceptor(new MultitenancyInterceptor());

及其实现:

public class MultitenancyInterceptor extends EmptyInterceptor {

    @Override
    public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
        //logic to update the TenantContext
        return super.onLoad(entity, id, state, propertyNames, types);
    }
}

是否有任何拦截器可以帮助我在每次从 AbstractMultiTenantConnectionProvider 获取连接之前计算 TenantContext?

public abstract class MultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider {
...
    @Override
    public Connection getConnection(String tenantIdentifier)
            throws SQLException {
        Connection connection = super.getConnection(tenantIdentifier);
        connection.createStatement()
                .execute(String.format("USE `%s`;", tenantIdentifier));
        return connection;
    }
}

I'm working with Spring multitenancy framework, and i'm trying to set the TenanContext depending on a property in each Entity class.
The interceptor that I use doesn't set the TenantSelector before each transaction, and I don't find any to achieve it (onLoad do everything during the application load but not before each transaction). I'm trying other interceptors from org.hibernate.EmptyInterceptor but any do what I need.

This is the interceptor that I use:

LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setEntityInterceptor(new MultitenancyInterceptor());

And its implementation:

public class MultitenancyInterceptor extends EmptyInterceptor {

    @Override
    public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
        //logic to update the TenantContext
        return super.onLoad(entity, id, state, propertyNames, types);
    }
}

Is there any interceptor which can help me to calculate the TenantContext before each getConnection from AbstractMultiTenantConnectionProvider?

public abstract class MultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider {
...
    @Override
    public Connection getConnection(String tenantIdentifier)
            throws SQLException {
        Connection connection = super.getConnection(tenantIdentifier);
        connection.createStatement()
                .execute(String.format("USE `%s`;", tenantIdentifier));
        return connection;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文