Spring Boot 2.7.2集成HSQL数据库遇Hibernate方言配置异常求助
解决Hibernate DialectResolutionInfo为空异常(HSQL + Spring Boot集成)
技术栈:Spring Boot 2.7.2、HSQL 2.7.0、Java 18,当前遇到异常:HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set,已尝试移除datasource.url、导入hsql-config.xml等方案无效。
现有配置文件
pom.xml
<?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 http://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>2.7.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>de.bloise</groupId> <artifactId>skt</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>18</maven.compiler.source> <maven.compiler.target>18</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <hsql.version>2.7.0</hsql.version> <hibernate.version>6.1.0.Final</hibernate.version> <hibernate.core.version>5.6.10.Final</hibernate.core.version> </properties> <dependencies> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>${hsql.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.core.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.6.10.Final</version> </dependency> <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${project.parent.version}</version> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>
application.properties
# =============================== # = SERVER # =============================== server.port= 9050 # HIBERNATE spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true spring.jpa.database-platform=org.hibernate.dialect.HSQLDialect spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.HSQLDialect spring.jackson.serialization.fail-on-empty-beans=false # Naming strategy #spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl #spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy # Database spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver spring.datasource.url=jdbc:hsqldb:hsql://localhost/testdb spring.datasource.username=sa spring.datasource.password=
解决思路
1. 修复依赖冲突(核心问题)
Spring Boot 2.7.2默认适配Hibernate 5.6.x版本,你手动引入的hibernate-core、hibernate-entitymanager与Spring Boot管理的版本存在冲突,且Hibernate 5+版本中hibernate-entitymanager已合并到hibernate-core,无需单独引入:
- 删除pom.xml中手动添加的
hibernate-core和hibernate-entitymanager依赖 - 删除properties中的
hibernate.version和hibernate.core.version配置,完全依赖Spring Boot parent的版本管理
2. 修正HSQL数据源配置
你当前使用的是HSQL服务器模式(jdbc:hsqldb:hsql://localhost/testdb),该模式需要单独启动HSQL服务器才能连接,若你实际需要的是嵌入式数据库,请修改url:
- 内存模式(应用重启后数据丢失):
spring.datasource.url=jdbc:hsqldb:mem:testdb - 文件模式(数据持久化到文件):
spring.datasource.url=jdbc:hsqldb:file:./data/testdb;shutdown=true
若坚持使用服务器模式,确保HSQL服务器已启动,端口与配置一致。
3. 简化Hibernate配置
- 保留
spring.jpa.database-platform=org.hibernate.dialect.HSQLDialect即可,无需重复设置spring.jpa.properties.hibernate.dialect,Spring Boot会自动识别并应用 - 可删除
spring.datasource.driver-class-name,Spring Boot会根据数据源url自动匹配驱动类
内容的提问来源于stack exchange,提问作者Tony B
相关产品推荐
相关产品推荐

