无法将名称 [org.hibernate.dialect.MySQL5Dialect] 解析为策略 [org.hibernate.dialect.Dialect]

33

我是Spring应用程序和Gradle的新手。 运行我的项目以创建基于我创建的类的数据库对象时,我遇到了以下错误:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.dialect.MySQL5Dialect ] as strategy [org.hibernate.dialect.Dialect]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1572)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:960)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:749)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:117)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:689)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:321)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:969)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:958)
at com.krypton.smartImmo.SmartImmoApplication.main(SmartImmoApplication.java:10)

Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.dialect.MySQL5Dialect ] as strategy [org.hibernate.dialect.Dialect]
at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.selectStrategyImplementor(StrategySelectorImpl.java:128)
at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveDefaultableStrategy(StrategySelectorImpl.java:155)
at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveStrategy(StrategySelectorImpl.java:136)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:78)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:68)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:165)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)

application.properties 文件中,我设置了以下有关 Hibernate 的配置:

spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 

你使用的是哪个版本的Hibernate? - Gergely Bacso
@GergelyBacso 版本 4.3.11.Final - Djama
我认为你在 "org.hibernate.dialect.MySQL5Dialect" 后面加了一个空格……?我在 "[org.hibernate.dialect.MySQL5Dialect ]" 的堆栈跟踪中看到了这个空格。 - Si mo
我想在这里指出,我遇到了同样的问题,但我的问题并不是因为空格或类似的原因,当我使用MySQL8Dialect而不是MysqlnnoDBDialect时,我的问题得到了解决。 - Ananthu K Kumar
7个回答

75

由于您的错误消息末尾包含可疑的额外空格:

Unable to resolve name [org.hibernate.dialect.MySQL5Dialect ]
我猜你的方言属性末尾可能有多余的空格。
所以请查找:
"org.hibernate.dialect.MySQL5Dialect "

并将其更改为:

"org.hibernate.dialect.MySQL5Dialect"

2
是的,你说得对,我不知道这可能是错误的根源 : )。很高兴学到了这一点。 - Djama
1
最常见的错误通常是使用尚未添加到特定Hibernate版本中的方言,或者是由于大小写字母错误而产生的有趣的拼写错误。 - Gergely Bacso
2
我怎么可能遇到完全相同的问题呢?天啊,我们中有38个人也遇到了这个问题。太疯狂了! - markthegrea

15

我也遇到了同样的问题,在属性文件中不需要声明任何方言,在删除方言属性后,它可以正常工作。

我的依赖项:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.7</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.7</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

应用程序属性: 在此输入图片描述

spring.datasource.name =test
spring.datasource.url=jdbc:mysql://localhost:3306/myDB
spring.datasource.username=root
spring.datasource.password=root
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.jpa.properties.hibernate.dialect=org.hibernate.deialect.MySql5InnoDBDialect
#spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
#spring.jpa.properties.hibernate.dialect=org.hibernate.deialect.MySql55Dialect
spring.datasource.hikari.maximum-pool-size=10
##spring.jpa.hibernate.ddl-auto=updates`

6
嗨,我正在使用Spring Boot版本3.0.1,在去除方言后它可以工作,谢谢。 - Santosh budhe
2
是的,在删除方言属性后,它可以正常工作。 - dgupta3091
1
对我而言,Spring Boot 3.0.1版本也是如此。移除方言即可解决问题。 - Tom Van Schoor
1
我正在使用3.1.0版本,并且遇到了以下问题:无法确定方言(JDBC元数据缺失,请设置 'javax.persistence.jdbc.url'、'hibernate.connection.url' 或 'hibernate.dialect')。 - lemario

12
[Solved 2023] 我正在使用MySQL'8',所以我只需将其更改为MySQL8Dialect

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

请检查您的MySQL版本,它会正常工作。

2
首先感谢您的回答。当我即将放弃解决错误时,它拯救了我。由于 org.hibernate.dialect.MySQL8Dialect 已被弃用,建议您将其更新为 org.hibernate.dialect.MySQLDialect - Kasasira

5

实际上,如果您的方言名称正确,空间不是问题。

但正如Rajiv Mishra所说,您不需要显式指定方言,Spring Boot会自动处理。

我正在使用STS IDE进行此操作。

输入图像描述


你有一个包括方言属性末尾空格的工作示例吗? - Thomas Naskali
谢谢,完全删除该属性起作用了! - dgupta3091
我正在使用版本3.1.0,但我遇到了问题:无法确定方言,没有JDBC元数据(请设置'javax.persistence.jdbc.url'、'hibernate.connection.url'或'hibernate.dialect')。 - lemario

4
如果您使用的是Spring Boot 3.0.1以上的版本,则请完全从您的application.properties文件中删除方言配置。Spring Boot会为您完成这项工作。

1
我正在使用版本3.1.0,并且出现以下错误: 无法确定方言,没有JDBC元数据(请设置'javax.persistence.jdbc.url'、'hibernate.connection.url'或'hibernate.dialect') - lemario
感谢您的反馈。在从属性文件中删除spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect后,系统正常运行。 - undefined

2
我的MySQL版本是8.1,所以我尝试了org.hibernate.dialect.MySQL8Dialect,它起作用了,但是MySQL8Dialect已经被弃用了; 请使用org.hibernate.dialect.MySQLDialect代替。

0

谢谢!我也遇到了额外空格的问题。我们只需确保,每当我们点击app.properties文件中的不同行时,光标应该在MySQL8Dialect字母t的旁边,就在末尾。用" "引号括起来键spring.jpa.properties.hibernate.dialect的值,然后将其删除,这样我就解决了问题,因为光标没有出现在字母t之后。


2
请重新表述,使其更明显地成为答案,看起来不像是您自己问题的描述。 - Yunnosch
我也遇到了与方言org.hibernate.dialect.MySQL8Dialect相同的问题,我将其替换为org.hibernate.dialect.MySQLDialect。现在它对我有效了。 Venkat。 - Venkata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接