Hibernate使用单独的模式进行多租户

时间:2015-09-17 21:06:42

标签: java hibernate spring-data spring-data-jpa multi-tenant

问题

我在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的角度来看,SCHEMADATABASEMultiTenantConnectionProvider之间是否存在差异?我理解这两者之间的概念差异,但从查看源代码,我觉得这两个是完全可以互换的,所有逻辑都隐藏在/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 的实现中。我错过了什么吗?

0 个答案:

没有答案