我在Spring 4,Hibernate 5和Spring Data JPA 1.7上构建了一个应用程序。我使用PostgresSQL作为数据库。我想使用Hibernate对多租户的支持,但是在正确实现MultiTenantConnectionProvider
方面存在问题。我想使用SCHEMA策略来分离租户,我更喜欢使用单DataSource
。
我目前MultiTenantConnectionProvider
方法getConnection()
的实现如下:
@Override
public Connection getConnection(String tenantIdentifier) throws SQLException {
final Connection connection = getAnyConnection();
try {
connection.createStatement().execute("SET SCHEMA '" + tenantIdentifier + "'");
}
catch (SQLException e) {
throw new HibernateException("Could not alter JDBC connection to specified schema [" + tenantIdentifier + "]", e);
}
return connection;
}
我从connection
获取DataSource
,我通过实现接口ServiceRegistryAwareService
注入了tenantIdentifier
,但我不确定这是否正确。
当方法应该正确CurrentTenantIdentifierResolver
(来自我的<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="pu" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQL9Dialect" />
</bean>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="dataSource" ref="dataSource" />
</bean>
的实现)时,方法被调用,语句被执行,但在实践中,它是无用的。问题是,Hibernate生成的查询包含完全限定的表名,包括默认模式。我可以告诉hibernate从查询中省略默认架构吗?或者我应该使用完全不同的方法吗?
我不想用太多配置来混淆我的问题,我会在这里粘贴我认为相关的内容。如果我错过了重要的事情,请告诉我。
这是我的应用程序上下文xml
的一部分hibernate.multiTenancy
从Hibernate的角度来看,SCHEMA
值DATABASE
和MultiTenantConnectionProvider
之间是否存在差异?我理解这两者之间的概念差异,但从查看源代码,我觉得这两个是完全可以互换的,所有逻辑都隐藏在/shared
node_modules
shared_scss
shared_js
gulpfile.js
/client-project-1
client_scss
client_js
gulpfile.js
/client-project-2
/client-project-3
/client-project-n
的实现中。我错过了什么吗?