我们想要创建一个 Spring Boot Hibernate 多租户项目。我们使用每个数据库租户的方法。 期望在每次请求期间从标头中提取租户 ID。没有默认租户。
public class RoutingDataSourceProvider extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return TenantContext.getCurrentTenant(); // null by default
}
}
在应用程序启动期间,Hibernate 会尝试初始化,并且应用程序最终会出现错误(这是预期的情况),因为没有默认的数据源。
getJdbcEnvironmentUsingJdbcMetadata:345 - HHH000342: Could not obtain connection to query metadata
java.lang.IllegalStateException: Cannot determine target DataSource for lookup key [null]
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
有什么办法可以避免Hibernate在启动过程中初始化吗?
我们试图找到一些解决方案,但我们一无所获。
您可以使用
@Lazy
注释数据源、实体管理器和事务上下文 bean。当应用程序启动时,会出现 Hibernate 错误,但最后它会结束启动过程。显然,这取决于您在应用程序中配置 Bean 的方式及其启动方式。
您可以尝试的另一个选项是配置一个假的 H2 内存数据源作为您的
RoutingDataSourceProvider
的默认数据源,其唯一目的是避免应用程序启动时出现错误。在这种情况下,唯一的问题是您需要一种方法来在应用程序启动后释放为内存数据库分配的资源。