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

Kle*_*ota 178 java hibernate jpa maven spring-boot

我正在尝试运行一个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
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

我的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");
         }
      };
   }
}
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

M. *_*num 180

首先删除所有配置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
Run Code Online (Sandbox Code Playgroud)

如果您确实需要访问a SessionFactory并且基本上是针对相同的数据源,那么您可以执行以下操作(尽管对于XML而不是JavaConfig,此处也会对其进行说明).

@Configuration        
public class HibernateConfig {

    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
         HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
         factory.setEntityManagerFactory(emf);
         return factory;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样你既有a EntityManagerFactory又有a SessionFactory.

假设你有一个带有main方法的类,@EnableAutoConfiguration你不需要@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);
    }

} 
Run Code Online (Sandbox Code Playgroud)

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

我还建议删除commons-dbcp依赖项,因为这将允许Spring Boot配置更快,更健壮的HikariCP实现.

  • 而不是使用3个注释,即Configuration,EnableAutoConfiguration,ComponentScan.我们可以使用SpringBootApplication注释 (3认同)
  • 为什么?Spring Boot的全部目的是为你自动配置...所以你更喜欢在属性文件中包含超过7行的详细java配置?! (2认同)
  • 它甚至可以是属性文件中的6行.当您使用Postgres时,您不需要设置spring.datasource.driverClassName,因为Boot会从spring.datasource.url推断它. (2认同)
  • @AlexWorden不,它不是......而不是随机发表评论,你可能首先要阅读如何加载属性,尤其是Spring Boot支持.如果直接设置文件权限,磁盘上的密码不一定是个问题.将它们放入数据库并不是更好...... (2认同)

mhn*_*oka 131

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

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

  • 遇到了同样的问题,在我的情况下,数据库已启动,但凭据错误.+1 (8认同)
  • 如果您尝试连接的数据库不存在,您也会看到此错误. (5认同)
  • 为什么它不首先抛出一个更明显的错误,例如“无法连接到数据库”或其他错误? (5认同)
  • 我的问题与此类似,因为没有为远程连接配置服务器上的 pg_hba.conf,这给了我这个错误。 (2认同)

ACV*_*ACV 21

我的数据库没有创建时出现此错误.手动创建数据库后,它工作正常.

  • 通常,您可以使用“spring.jpa.hibernate.ddl-auto=create”来避免手动创建 (2认同)
  • @AlexWorden,Andrei意味着如果它是Spring Boot,你可以把它放在application.properties中.必须有基于xml的Spring配置的等价物. (2认同)

alp*_*ine 19

添加spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialectapplication.properties文件


Pan*_*kaj 17

我也遇到过类似的问题.但是,这是由于提供的密码无效.另外,我想说你的代码似乎是使用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=
Run Code Online (Sandbox Code Playgroud)


abi*_*ode 9

以下是hibernate.dialect未设置问题的一些原因。大多数异常都显示在启动日志中,最后是提到的问题。

示例:在带有 Postgres DB 的 Spring boot 应用程序中

1. 检查数据库是否实际安装以及数据库服务器是否启动。

  • org.postgresql.util.PSQLException:与 localhost:5432 的连接被拒绝。检查主机名和端口是否正确以及邮局主管是否接受 TCP/IP 连接。
  • java.net.ConnectException:连接被拒绝:连接
  • org.hibernate.service.spi.ServiceException:无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

2. 检查数据库名称是否正确。

3. 检查主机名和服务器端口是否可访问。

  • org.postgresql.util.PSQLException:与 localhost:5431 的连接被拒绝。检查主机名和端口是否正确以及邮局主管是否接受 TCP/IP 连接。
  • java.net.ConnectException:连接被拒绝:连接

4. 检查数据库凭据是否正确。

  • 正如@Pankaj 提到的
  • org.postgresql.util.PSQLException:致命:用户“postgres”的密码身份验证失败

    spring.datasource.username= {DB USERNAME HERE}

    spring.datasource.password= {DB PASSWORD HERE}


Art*_*emi 9

我有同样的问题。将此添加到 application.properties 解决了该问题:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
Run Code Online (Sandbox Code Playgroud)


Eri*_* B. 8

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

我创建了数据库,验证了URL /连接字符串并重新启动,一切都按预期工作.


Vla*_*cea 7

删除冗余的休眠配置

如果您使用的是 Spring Boot,则不需要显式提供 JPA 和 Hibernate 配置,因为 Spring Boot 可以为您完成。

添加数据库配置属性

application.propertiesSpring Boot 配置文件中,您可以添加数据库配置属性:

spring.datasource.driverClassName = org.postgresql.Driver
spring.datasource.url = jdbc:postgresql://localhost:5432/teste
spring.datasource.username = klebermo
spring.datasource.password = 123
Run Code Online (Sandbox Code Playgroud)

添加 Hibernate 特定属性

并且,在同一个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
Run Code Online (Sandbox Code Playgroud)

就是这样!


小智 5

在 jpa java config 的 spring boot 中,您需要扩展 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");
    }

}
Run Code Online (Sandbox Code Playgroud)