org.hibernate.HibernateException:当“hibernate.dialect”未设置时,对DialectResolutionInfo的访问不能为null

我试图运行一个春季启动应用程序使用hibernate通过spring-jpa,但我得到这个错误:

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> 

我的hibernateconfiguration是(方言configuration在这个类的最后一个方法):

 @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"); } }; } } 

我在这里做错了什么?

首先删除所有的configurationSpring Boot会为你启动它。 如果你真的需要一个SessionFactory而不是一个EntityManagerFactory添加一个HibernateJpaSessionFactoryBean

确保你的类path中有一个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并且基本上是为同一个数据源的话,你可以做以下的事情(虽然对于不是JavaConfig的XML,但是这里也是这样的)。

 @Configuration public class HibernateConfig { @Bean public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) { HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean(); factory.setEntityManagerFactory(emf); return factory; } } 

这样你有一个EntityManagerFactory和一个SessionFactory

假设你有一个带有@EnableAutoConfigurationmain方法的类,你不需要@EnableTransactionManagement注解,因为Spring Boot会为你启用它。 com.spring.app包中的基本应用程序类应该足够了。

 @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } } 

像这样的东西应该足以让你的所有类(包括实体和基于Spring Data的存储库被检测到)。

我还build议删除commons-dbcp依赖关系,因为这将允许Spring Bootconfiguration更快更强大的tomcat-jdbc实现。

在启动数据库服务器的应用程序(使用Spring Boot)时,我遇到了类似的问题。

Hibernate可以自动确定正确的方言,但是为了做到这一点,它需要一个到数据库的实时连接。

当我的数据库没有被创build时,我得到了这个错误。 手动创build数据库后,它工作正常。

我也面临类似的问题。 但是,这是由于提供的密码无效。 另外,我想说你的代码似乎是使用spring的旧式代码。 你已经提到你正在使用spring boot,这意味着大部分的东西都会自动为你configuration。 hibernate方言将根据类path上可用的数据库驱动程序自动select,以及可用于正确testing连接的有效凭证。 它有任何连接问题,你将再次面临同样的错误。 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= 

我遇到了同样的问题,我的问题是,我试图连接到数据库不存在。

我创build了数据库,validation了URL /连接string,并重新执行,并按预期工作。

这是因为你的代码不能打包连接数据库。 确保你有mysql驱动和用户名,密码正确。

确保你的application.properties有所有正确的信息:(我改变了我的数据库端口从88893306它的工作)

  db.url: jdbc:mysql://localhost:3306/test 

在我的情况下,用户无法连接到数据库。 如果日志在exception之前包含警告,将会有相同的问题:

 WARN HHH000342: Could not obtain connection to query metadata : Login failed for user 'my_user'. 

确保你有你的数据库像OP一样。 那是我的问题。

我的问题是embedded式数据库已经连接。 紧密连接

在application.properties文件中添加spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect

我有同样的问题,这是由于无法连接到数据库实例。 在上面的错误日志中寻找HibernateHHH000342错误,它应该给你一个想法,在数据库连接失败(不正确的用户名/密码,url等)

如果你正在使用这一行:

 sessionFactory.getHibernateProperties().put("hibernate.dialect", env.getProperty("hibernate.dialect")); 

确保env.getProperty("hibernate.dialect")不为空。