我正在尝试解决与正在开发的SpringWebMVC应用程序的多租户相关的问题。
需要为每个注册的客户动态创建架构。一旦他们登录,他们所做的所有交易都应该违反该架构。
为此,我尝试利用Hibernate 5 Multi-Tenancy。它工作正常 - 直到为每个客户生成模式。应用程序从公共模式定义开始,为@Table
中提到的公共模式创建所有实体表,然后在填充表之前(使用该模式的实体定义)尝试将数据插入{{ 1}}并抛出schema.table
不可用的错误。
我正在使用扩展schema.table
的类来通过AbstractDataSourceBasedMultiTenantConnectionProviderImpl
注入提供Environment.MULTI_TENANT_CONNECTION_PROVIDER
到对象引用。 @Autowired
接口由类实现,以提供CurrentTenantIdentifierResolver
到Environment.MULTI_TENANT_IDENTIFIER_RESOLVER
注入的对象引用。
不确定为什么Hibernate / JPA提供程序无法为即时创建的架构填充表。 JPAProperties如下:
@Autowired
Properties jpaProperties = new Properties();
jpaProperties.put("javax.persistence.schema-generation.database.action", "create-drop");
jpaProperties.put("javax.persistence.create-database-schemas", true);
jpaProperties.put(Environment.HBM2DDL_AUTO, "create-drop");
jpaProperties.put(Environment.DEFAULT_SCHEMA, "base_schema");
jpaProperties.put(Environment.MULTI_TENANT, "SCHEMA");
jpaProperties.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, applicationCurrentTenantIdentifierResolver);
jpaProperties.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, applicationMultiTenantConnectionProvider);
jpaProperties.put(Environment.FORMAT_SQL, true);
jpaProperties.put("spring.jpa.hibernate.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
jpaProperties.put(Environment.USE_SQL_COMMENTS, true);
jpaProperties.put(Environment.GENERATE_STATISTICS, true);
jpaProperties.put("hbm2dll.create_namespaces", true);
具有以下值:
HibernateVendorAdapter
POM有以下库:
属性:
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
vendorAdapter.setShowSql(true);
vendorAdapter.setGenerateDdl(true);
vendorAdapter.setDatabase(Database.MYSQL);
依赖项:
<properties>
<project.mysql.connector.version>5.1.30</project.mysql.connector.version>
<project.hibernate.version>5.2.2.Final</project.hibernate.version>
<project.spring.orm.version>4.3.3.RELEASE</project.spring.orm.version>
<project.spring.data.jpa.version>1.10.3.RELEASE</project.spring.data.jpa.version>
</properties>