【发布时间】:2021-09-27 15:58:37
【问题描述】:
我是 Hibernate 的新手。 在我的代码中,与 DB 的连接由 Hikari 数据源管理。
我的代码现在是多租户的,但它为所有租户管理相同的休眠方言。
是否可以创建每个租户可以使用不同方言的配置? 方言的类型可以作为租户的属性提供。
这是 entityManagerFactory 的示例:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
Map<String, Object> jpaProperties = new HashMap<>();
jpaProperties.put(..., ...);
jpaProperties.put(org.hibernate.cfg.Environment.DIALECT, "myDialect");
LocalContainerEntityManagerFactoryBean emfBean = new LocalContainerEntityManagerFactoryBean();
emfBean.setPackagesToScan(new String[] {MyEntity.class.getPackage().getName()});
emfBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
emfBean.setJpaPropertyMap(jpaProperties);
return emfBean;
}
编辑
我正在寻找这个solution:它建议为每种方言创建一个重复的 LocalContainerEntityManagerFactoryBean。 我不明白的是,我如何判断何时使用一个 EntityManager (MySQL) 和另一个 (Postgres 或 MsSQL):solution 区分实体(每个实体都有自己的数据库)但在我的情况下,所有实体在所有数据库上。是歧视的租户。
例如:如果我创建了第二个 LocalContainerEntityManagerFactoryBean 实例(即 msSQLEntityManagerFactory())并设置了 SQL Server 方言,则应用程序无法启动:
Application failed to start due to an exceptionorg.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type 'javax.persistence.EntityManagerFactory' available:
expected single matching bean but found 2:
msSQLEntityManagerFactory,entityManagerFactory
【问题讨论】:
-
多租户代码是什么意思?
-
我有一个一体化架构:同一个软件实例和同一个 MySQL 可以用于不同的租户。每个租户由一个输入参数标识,该参数映射到一组配置(例如:租户数据库的凭据和 URL)。每个租户只能用于连接到其数据库(但所有租户都在同一个 MySQL 实例上。将来,我希望在 MySQL 上拥有一个租户,在 PostgresSQL 上拥有一个租户,在 SQL Server 上拥有一个租户,但都在软件的相同实例。
-
对不起,我仍然很难理解多租户代码。也许您需要将方言放入属性文件中,将此属性文件作为属性源添加到 spring 的环境抽象中,然后在配置类中结合使用 PropertySourcesPlaceholderConfigurer 和 Value 注释来设置适当的方言。然后对于每个租户,您将拥有不同的属性文件。
-
我不明白...如何动态设置方言?软件的同一个实例如何从一个切换到另一个?
-
在你的程序中什么时候需要改变方言?如果您的程序同时使用多个数据库,那么也许您可以使用不同的方言为每个数据库声明 EntityManager。
标签: java spring hibernate hikaricp dialect