我无法启动我的 Spring Boot 应用程序原因:org.hibernate.service.spi.ServiceException:无法创建请求的服务 [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment],原因是:U...
我无法启动我的 Spring Boot 应用程序
Caused by: org.hibernate.service.spi.ServiceException:
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)
这是我的应用程序属性(全部):
spring:
datasource:
username: ${POSTGRES_USERNAME:postgres}
password: ${POSTGRES_PASSWORD:postgres}
url: ${POSTGRES_URL:jdbc:postgresql://localhost:5432/${POSTGRES_USERNAME}}
这是我的 pom。我尝试修剪以仅包含相关部分(同时确保它仍然是一个可以复制和粘贴的有效 pom)。基本上,要重现它,您只需创建一个带有数据启动器(可能还有驱动程序)的 Boot 项目,以便 Boot 的自动配置(带有 的那个 DataSource
)启动
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>token-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>token-service</name>
<description>token-service</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
</dependencies>
</project>
如果我明确设置该 spring.jpa.database-platform
属性,它就会正常启动。但是,我以前使用 MySQL 时从未这样做过
spring:
# ...
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
为什么 Boot 不能推断出方言?
我使用 Spring Boot 和 Postgres,而没有手动设置方言,但你必须记住这一点。
只有 Hibernate 6 或更高版本可以根据您的数据库库 en 连接自动进行方言解析。否则,您必须手动提供它。
因此,请确保您使用的是 Hibernate v6 或更高版本。如果不更新它(请小心,也许您必须更新代码中的其他内容),或者只是像您之前那样设置方言;在大多数情况下,它不会产生太大影响。