首页 文章

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

提问于
浏览
132

我正在尝试运行一个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");
         }
      };
   }
}

我在这做错了什么?

21 回答

  • 5

    使用hibernate代码生成后,我遇到了同样的错误

    https://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/

    然后 hibernate.cfg.xml/src/main/java 中创建但在删除后没有连接参数 - 我的问题解决了

  • 15

    当Eclipse无法找到JDBC驱动程序时,我遇到了这个问题 . 不得不从日食中做一个gradle刷新来完成这项工作 .

  • 0

    首先删除所有配置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会为你启用它 . com.spring.app 包中的基本应用程序类应该足够了 .

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

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

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

  • 0

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

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

  • 0

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

  • 0

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

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

  • 2

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

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

  • 0

    发生这种情况是因为您的代码不是连接数据库的代码 . 确保你有mysql驱动程序和用户名,密码正确 .

  • 12

    确保你的 application.properties 具有所有正确的信息:(我将我的数据库端口从 8889 更改为 3306 它工作正常)

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

    在我的情况下,用户无法连接到数据库 . 如果日志在异常之前包含警告,则会出现同样的问题:

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

    确保你的数据库像OP一样在你的pom中 . 那是我的问题 .

  • 0

    我的问题是嵌入式数据库已经连接 . 密切联系

  • 2

    我遇到了同样的问题,这是因为无法连接到数据库实例 . 在该错误上方的日志中查找hibernate错误HHH000342,它应该让您知道数据库连接失败的位置(错误的用户名/通道,网址等)

  • 10

    如果您使用此行:

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

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

  • 0

    这发生在我身上,因为我在开始会话之前没有添加 conf.configure();

    Configuration conf = new Configuration();
    conf.configure();
    
  • 3

    确保在 application.properties 中输入了有效的详细信息以及数据库服务器是否可用 . 作为连接MySQL的示例,请检查 XAMPP 是否正常运行 .

  • 0

    我遇到了同样的问题:我尝试连接的数据库不存在 . 我使用 jpa.database=default (我想这意味着它会尝试连接到数据库,然后自动选择方言) . 一旦我启动数据库,它工作正常,没有任何变化 .

  • 101

    相同但在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>
    
  • 3

    对于使用AWS MySQL RDS的用户,可能会在无法连接到数据库时发生 . 去针对MySQL RDS的AWS安全组设置,并通过刷新MyIP来编辑入站IP规则 .

    我遇到了这个问题而且上面的问题为我解决了问题 .

  • 2

    由于Mysql 8.0.11版本还原为5.7,我遇到了这个问题

相关问题