我正在尝试运行一个spring-boot应用程序,它通过spring-jpa使用hibernate,但是我收到了这个错误:
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:104)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:71)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:205)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550)
... 21 more
我的pom.xml文件是这样的:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.8.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
</dependency>
</dependencies>
我的hibernate配置是(方言配置在这个类的最后一个方法中):
@Configuration
@EnableTransactionManagement
@ComponentScan({ "com.spring.app" })
public class HibernateConfig {
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(restDataSource());
sessionFactory.setPackagesToScan(new String[] { "com.spring.app.model" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource restDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.postgresql.Driver");
dataSource.setUrl("jdbc:postgresql://localhost:5432/teste?charSet=LATIN1");
dataSource.setUsername("klebermo");
dataSource.setPassword("123");
return dataSource;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
Properties hibernateProperties() {
return new Properties() {
/**
*
*/
private static final long serialVersionUID = 1L;
{
setProperty("hibernate.hbm2ddl.auto", "create");
setProperty("hibernate.show_sql", "false");
setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
}
};
}
}
我在这里做错了什么?
答案 0 :(得分:162)
首先删除所有配置Spring Boot将为您启动它。如果您确实需要SessionFactory
而不是EntityManagerFactory
,请添加HibernateJpaSessionFactoryBean
。
确保您的类路径中有application.properties
并添加以下属性。
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/teste?charSet=LATIN1
spring.datasource.username=klebermo
spring.datasource.password=123
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=create
如果您确实需要访问SessionFactory
并且基本上是针对相同的数据源,那么您可以执行以下操作(虽然对于XML而不是JavaConfig,也可以对其进行文档化here。
@Configuration
public class HibernateConfig {
@Bean
public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
factory.setEntityManagerFactory(emf);
return factory;
}
}
这样,您同时拥有EntityManagerFactory
和SessionFactory
。
假设您的类具有main
方法且@EnableAutoConfiguration
,则不需要@EnableTransactionManagement
注释,因为Spring Boot会为您启用。 <{1}}包中的基本应用程序类就足够了。
com.spring.app
这样的东西应该足以让你的所有类(包括实体和基于Spring Data的存储库)被检测到。
我还建议删除@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
依赖项,因为这样可以让Spring Boot配置更快,更健壮的HikariCP
实现。
答案 1 :(得分:117)
在启动应用程序(使用Spring Boot)并将数据库服务器关闭时,我遇到了类似的问题。
Hibernate可以确定自动使用的正确方言,但为了做到这一点,它需要与数据库的实时连接。
答案 2 :(得分:19)
我的数据库未创建时出现此错误。手动创建数据库后,它运行正常。
答案 3 :(得分:15)
我也遇到过类似的问题。但是,这是由于提供的密码无效。另外,我想说你的代码似乎是使用spring的旧样式代码。您已经提到过您正在使用spring boot,这意味着大部分内容都将自动为您配置。将根据类路径上可用的数据库驱动程序以及可用于正确测试连接的有效凭据自动选择hibernate dialect。连接有任何问题,您将再次面临同样的错误。 application.properties中只需要3个属性
# Replace with your connection string
spring.datasource.url=jdbc:mysql://localhost:3306/pdb1
# Replace with your credentials
spring.datasource.username=root
spring.datasource.password=
答案 4 :(得分:13)
在application.properties文件中添加spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
答案 5 :(得分:6)
我遇到了同样的问题,我的问题是我尝试连接的数据库不存在。
我创建了数据库,验证了URL /连接字符串并重新运行,所有内容都按预期工作。
答案 6 :(得分:6)
我有同样的问题。将此添加到application.properties解决了该问题:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
答案 7 :(得分:5)
如果您使用的是Spring Boot,则不需要显式提供JPA和Hibernate配置,因为Spring Boot可以为您做到这一点。
在application.properties
Spring Boot配置文件中,您具有添加数据库配置属性:
spring.datasource.driverClassName = "org.postgresql.Driver
spring.datasource.url = jdbc:postgresql://localhost:5432/teste?charSet=LATIN1
spring.datasource.username = klebermo
spring.datasource.password = 123
并且,在相同的application.properties
配置文件中,您还可以设置自定义的Hibernate属性:
# Log SQL statements
spring.jpa.show-sql = false
# Hibernate ddl auto for generating the database schema
spring.jpa.hibernate.ddl-auto = create
# Hibernate database Dialect
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
就是这样!
答案 8 :(得分:3)
确保您的application.properties
包含所有正确的信息:(我将我的数据库端口从8889
更改为3306
它有效)
db.url: jdbc:mysql://localhost:3306/test
答案 9 :(得分:3)
这种情况正在发生,因为您的代码不是连接数据库的麻烦。确保你有mysql驱动程序和用户名,密码正确。
答案 10 :(得分:2)
我的问题是嵌入式数据库已经连接。关闭连接
答案 11 :(得分:2)
在jpa java config的春季启动中,您需要扩展JpaBaseConfiguration并实现它的抽象方法。
@Configuration
public class JpaConfig extends JpaBaseConfiguration {
@Override
protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
return vendorAdapter;
}
@Override
protected Map<String, Object> getVendorProperties() {
Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
}
}
答案 12 :(得分:2)
以下是hibernate.dialect
未设置问题的一些原因。
这些异常中的大多数都显示在启动日志中,然后最后是提到的问题。
示例:在具有Postgres DB的Spring引导应用中
org.postgresql.util.PSQLException:致命:数据库“ foo”不存在
在application.properties
文件中,
spring.datasource.url = jdbc:postgresql://localhost:5432/foo
但是foo
不存在。
所以我从pgAdmin为postgres创建了数据库
CREATE DATABASE foo;
org.postgresql.util.PSQLException:致命:用户“ postgres”的密码身份验证失败
spring.datasource.username= {DB USERNAME HERE}
spring.datasource.password= {DB PASSWORD HERE}
答案 13 :(得分:2)
确保您的数据库与OP一样在您的pom中。那是我的问题。
答案 14 :(得分:2)
在我的情况下,用户无法连接到数据库。如果日志在异常之前包含警告,则会出现同样的问题:
boston-texas
答案 15 :(得分:1)
在以下三种情况下,我重现了此错误消息:
一种明显的解决方案是使用与spring-boot应用程序中相同的用户名和密码来创建新的数据库用户,或者更改您的spring-boot应用程序文件中的用户名和密码,以匹配现有的数据库用户并为该数据库授予足够的特权用户。如果是MySQL数据库,则可以如下所示进行操作:
x[startsWith(x,"$")]
显然在Postgresql中有类似的命令,但是我还没有测试过在这三种情况下是否可以重现此错误消息。
答案 16 :(得分:1)
事实证明,如果您使用 Spring JPA,则 spring.jpa.database=mysql
文件中没有人提到设置 application.properties
。这是对我来说最简单的答案,我想在这个问题中分享。
答案 17 :(得分:1)
我也有这个问题。以我为例,这是因为没有为MySQL用户分配任何拨款。向我的应用程序使用的MySQL用户分配赠款解决了该问题:
grant select, insert, delete, update on my_db.* to 'my_user'@'%';
答案 18 :(得分:1)
当Eclipse无法找到JDBC驱动程序时,我遇到了这个问题。必须从月食中进行刷新以完成这项工作。
答案 19 :(得分:0)
我遇到了这个问题,因为Mysql 8.0.11版本还原为5.7为我解决了
答案 20 :(得分:0)
使用hibernate代码生成后我遇到了同样的错误
https://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/
然后在hibernate.cfg.xml
中创建了/src/main/java
但没有连接参数
删除后 - 我的问题解决了
答案 21 :(得分:0)
对于使用AWS MySQL RDS的用户,可能会在无法连接到数据库时发生。转到MySQL RDS的AWS Security Groups设置,并通过刷新MyIP来编辑入站IP规则。
我遇到了这个问题而且上面的问题为我解决了问题。
答案 22 :(得分:0)
相同但在 JBoss WildFly AS 。
解决了META-INF/persistence.xml
<properties>
<property name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
<property name="spring.jpa.database-platform" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="spring.jpa.show-sql" value="false" />
</properties>
答案 23 :(得分:0)
如果日志中的先前错误是这样的:“ ERROR-HikariPool-1-driverClassName需要jdbcUrl” 那么解决方案是根据以下内容将“ url”重写为“ jdbc-url”: Database application.yml for Spring boot from applications.properties
答案 24 :(得分:0)
我遇到了同样的问题,调试后发现Spring application.properties的数据库服务器IP地址错误
spring.datasource.url=jdbc:oracle:thin:@WRONG:1521/DEV
答案 25 :(得分:0)
我有同样的错误
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
在我的案例中,WAR的application.properties指向开发服务器
外部application.properties指向正确的数据库服务器的位置。
确保您在类路径/ jar中没有任何其他application.properties。
答案 26 :(得分:0)
我遇到了同样的问题:我尝试连接的数据库不存在。我使用jpa.database=default
(我想这意味着它将尝试连接到数据库,然后自动选择方言)。一旦我启动数据库,它工作正常,没有任何改变。
答案 27 :(得分:0)
将spring.jpa.database-platform=org.hibernate.dialect.MariaDB53Dialect
添加到我的属性文件中对我有用。
PS:我正在使用MariaDB
答案 28 :(得分:0)
确保您在 application.properties 中输入了有效的详细信息,以及您的数据库服务器是否可用。作为连接MySQL的示例,请检查 XAMPP 是否正常运行。
答案 29 :(得分:0)
这件事发生在我身上,因为在开始会议之前我没有添加conf.configure();
:
Configuration conf = new Configuration();
conf.configure();
答案 30 :(得分:0)
如果您使用此行:
sessionFactory.getHibernateProperties().put("hibernate.dialect", env.getProperty("hibernate.dialect"));
确保env.getProperty("hibernate.dialect")
不为空。
答案 31 :(得分:0)
在我的情况下,此异常的根本原因来自使用旧版本的mysql-connector,并且出现此错误:
unable to load authentication plugin 'caching_sha2_password'. mysql
将此行添加到mysql服务器配置文件(my.cnf或my.ini)可解决此问题:
default_authentication_plugin=mysql_native_password
答案 32 :(得分:0)
我遇到了同样的问题,这是因为无法连接到数据库实例。在该错误上方的日志中查找hibernate错误HHH000342,它应该让您知道数据库连接失败的位置(错误的用户名/通行证,网址等)