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

时间:2014-10-24 13:06:55

标签: java hibernate maven jpa 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

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

我在这里做错了什么?

33 个答案:

答案 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;
    }
}

这样,您同时拥有EntityManagerFactorySessionFactory

假设您的类具有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

添加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

就是这样!

答案 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引导应用中

1.检查数据库是否已实际安装并且其服务器已启动。

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

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

  • org.postgresql.util.PSQLException:致命:数据库“ foo”不存在

    application.properties文件中,

    spring.datasource.url = jdbc:postgresql://localhost:5432/foo
    

    但是foo不存在。 所以我从pgAdmin为postgres创建了数据库

    CREATE DATABASE foo;
    

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

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

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

  • @Pankaj提到的
  • 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)

在以下三种情况下,我重现了此错误消息:

  • 不存在具有用户名的数据库用户,该用户名写在application.properties文件或persistence.properties文件中,或者像您一样,在HibernateConfig文件中写
  • 已部署的数据库具有该用户,但是该用户通过与上述文件之一不同的密码来标识
  • 数据库具有该用户和密码匹配的用户,但该用户不具有完成spring-boot应用程序执行的所有数据库任务所需的所有特权

一种明显的解决方案是使用与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,它应该让您知道数据库连接失败的位置(错误的用户名/通行证,网址等)