Java 冬眠';s使用独立模式的多租户 问题
我在Spring4、Hibernate5和SpringDataJPA1.7上构建了一个应用程序。我使用PostgresSQL作为数据库。我想使用Hibernate对多租户的支持,但在正确实现Java 冬眠';s使用独立模式的多租户 问题,java,hibernate,spring-data,spring-data-jpa,multi-tenant,Java,Hibernate,Spring Data,Spring Data Jpa,Multi Tenant,我在Spring4、Hibernate5和SpringDataJPA1.7上构建了一个应用程序。我使用PostgresSQL作为数据库。我想使用Hibernate对多租户的支持,但在正确实现MultiTenantConnectionProvider时遇到问题。我想使用模式策略来分离租户,我更喜欢使用单个数据源 我当前实现的MultiTenantConnectionProvider方法getConnection()如下所示: @覆盖 公共连接getConnection(字符串租户标识符)引发SQL
MultiTenantConnectionProvider
时遇到问题。我想使用模式策略来分离租户,我更喜欢使用单个数据源
我当前实现的MultiTenantConnectionProvider
方法getConnection()
如下所示:
@覆盖
公共连接getConnection(字符串租户标识符)引发SQLException{
最终连接=getAnyConnection();
试一试{
connection.createStatement().execute(“SET SCHEMA'+tenantIdentifier+”);
}
捕获(SQLE异常){
抛出新的HibernateException(“无法将JDBC连接更改为指定的架构[“+tenantIdentifier+”],e);
}
回路连接;
}
我从我的数据源
中获取连接
,我通过实现接口ServiceRegistryAwareService
来注入该连接,但我不确定这是否正确
方法在应该使用正确的tenantIdentifier
(从我的CurrentTenantIdentifierResolver
实现中提交)时被调用,语句被执行,但在实践中,它是无用的。问题是,Hibernate生成的查询包含表的完全限定名,包括默认模式。我可以告诉hibernate从查询中省略默认模式吗?或者我应该使用完全不同的方法
我的配置
我不想用太多的配置把我的问题弄得一团糟,我会把我认为相关的东西粘贴到这里。如果我错过了重要的事情,请告诉我
这是我的应用程序上下文xml的一部分
附带问题
从hibernate的角度来看,hibernate.Multitenance
值SCHEMA
和数据库
之间有什么区别吗?我理解这两者在概念上的区别,但从源代码来看,在我看来这两者是完全可以互换的,所有的逻辑都隐藏在MultiTenantConnectionProvider
的实现中。我遗漏了什么吗?您好,您是否找到了一个在创建新租户时在运行时创建模式的工作示例?遗憾的是,我们最终采用了单独的数据库策略。我无法从Hibernate的查询中删除默认的“public”模式。新数据库由管理员手动创建。这对我们来说不是问题,因为在我们的应用程序中创建新租户是非常罕见的。我们每天不会创建太多租户,我仍然可以在晚上运行批处理来手动创建模式。但是,在尝试编写代码之前,有一个问题是,在手动创建模式之后,我是否必须重新启动应用程序?谢谢。我不知道,我对SQL模式和Hibernate没有太多经验。我想这会管用,但最好的办法就是试试:)顺便说一句,你有模式策略的工作配置吗?我已经醒了30个小时了,所以我现在要崩溃了。当我实施它时,我会通知你;)bientôtHi,您是否找到了一个在创建新租户时在运行时创建模式的工作示例?遗憾的是,没有,我们最终采用了单独的数据库策略。我无法从Hibernate的查询中删除默认的“public”模式。新数据库由管理员手动创建。这对我们来说不是问题,因为在我们的应用程序中创建新租户是非常罕见的。我们每天不会创建太多租户,我仍然可以在晚上运行批处理来手动创建模式。但是,在尝试编写代码之前,有一个问题是,在手动创建模式之后,我是否必须重新启动应用程序?谢谢。我不知道,我对SQL模式和Hibernate没有太多经验。我想这会管用,但最好的办法就是试试:)顺便说一句,你有模式策略的工作配置吗?我已经醒了30个小时了,所以我现在要崩溃了。当我实施它时,我会通知你;)棺材