Org.hibernate.HibernateException: доступ к DialectResolutionInfo не может быть нулевым, если "hibernate.dialect" не установлен

Я пытаюсь запустить приложение spring -boot, которое использует 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>

моя конфигурация спящего режима заключается в том, что (диалектная конфигурация находится в последнем методе из этого класса):

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

что я здесь делаю неправильно?

Ответ 1

Сначала удалите все ваши настройки Spring Boot запустит его для вас. Если вам действительно нужен SessionFactory вместо EntityManagerFactory добавьте HibernateJpaSessionFactoryBean.

Убедитесь, что у вас есть application.properties в вашем classpath и добавьте следующие свойства.

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).

@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. com.spring.app класса приложения в пакете 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.

Ответ 2

У меня возникла аналогичная проблема при запуске приложения (используя Spring Boot) с сервером базы данных.

Hibernate может определить правильный диалект для автоматического использования, но для этого ему требуется живое соединение с базой данных.

Ответ 3

Я получил эту ошибку, когда моя база данных не была создана. После создания БД он работал нормально.

Ответ 4

Я также столкнулся с подобной проблемой. Но это произошло из-за предоставленного неверного пароля. Кроме того, я хотел бы сказать, что ваш код выглядит как код старого стиля с использованием Spring. Вы уже упоминали, что используете весеннюю загрузку, что означает, что большинство вещей будут автоматически настроены для вас. Диалект гибернации будет автоматически выбран на основе драйвера БД, доступного на пути к классам, вместе с действительными учетными данными, которые можно использовать для правильного тестирования соединения. Если есть какие-либо проблемы с подключением, вы снова столкнетесь с той же ошибкой. только 3 свойства необходимы в application.properties

# Replace with your connection string
spring.datasource.url=jdbc:mysql://localhost:3306/pdb1

# Replace with your credentials
spring.datasource.username=root
spring.datasource.password=

Ответ 5

добавить spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect в файл application.properties

Ответ 6

Я столкнулся с той же проблемой, и моя проблема заключалась в том, что БД, к которой я пытался подключиться, не существовала.

Я создал БД, проверил строку URL/соединение и повторил, и все работало, как ожидалось.

Ответ 7

Убедитесь, что у вашего application.properties есть все правильные сведения: (я изменил свой порт db с 8889 на 3306, он сработал)

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

Ответ 8

Это происходит потому, что ваш код не используется для подключения базы данных. Убедитесь, что у вас есть драйвер mysql и имя пользователя, пароль правильный.

Ответ 9

При весенней загрузке для 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");
    }

}

Ответ 10

В моем случае пользователь не смог подключиться к базе данных. Если будет такая же проблема, если журнал содержит предупреждение перед исключением:

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

Ответ 11

Удостоверьтесь, что у вас есть база данных в вашем pom, как OP. Это была моя проблема.

Ответ 12

Моя проблема заключалась в том, что встроенная база данных уже подключена. тесное соединение

Ответ 13

Я получил эту проблему, когда Eclipse не смог найти драйвер JDBC. Пришлось сделать обновление Gradle от затмения, чтобы получить эту работу.

Ответ 14

Если вы используете эту строку:

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

убедитесь, что env.getProperty("hibernate.dialect") не является нулевым.

Ответ 15

У меня тоже была эта проблема. В моем случае это было из-за того, что пользователю MySQL не было назначено никаких грантов. Назначение грантов пользователю MySQL, который использует мое приложение, решило проблему:

grant select, insert, delete, update on my_db.* to 'my_user'@'%';

Ответ 16

У меня была такая же проблема, и это было вызвано невозможностью подключения к экземпляру базы данных. Ищите hibernate-ошибку HHH000342 в журнале выше этой ошибки, она должна дать вам представление о том, где происходит соединение db (неправильное имя пользователя/пароль, URL-адрес и т.д.).

Ответ 17

Это случилось со мной, потому что я не добавил conf.configure(); перед началом сеанса:

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

Ответ 18

После ругательства какое-то время я перезапустил свою среду IDE и начал работать:). Поэтому иногда решение может быть очень простым.

Ответ 19

Убедитесь, что вы ввели правильные данные в application.properties и укажите, доступен ли ваш сервер базы данных. Например, когда вы подключаетесь к MySQL, проверьте, правильно ли работает XAMPP.

Ответ 20

Я столкнулся с той же проблемой: база данных, которую я пытался подключить, не существовала. Я использовал jpa.database=default (что, я думаю, означает, что он попытается подключиться к базе данных, а затем автоматически выбрать диалект). Как только я запустил базу данных, она работала нормально без каких-либо изменений.

Ответ 21

То же самое, но в 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>

Ответ 22

Для тех, кто работает с AWS MySQL RDS, это может произойти, если вы не можете подключиться к базе данных. Перейдите к настройке групп безопасности AWS для MySQL RDS и измените правило входящих IP-адресов, обновив MyIP.

Я столкнулся с этой проблемой, и выполнение выше помогло мне решить проблему.

Ответ 23

У меня была такая же ошибка после использования спящего поколения кода

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

затем hibernate.cfg.xml был создан в /src/main/java но без параметров подключения после его удаления - моя проблема была решена

Ответ 24

Я столкнулся с этой проблемой из-за версии Mysql 8.0.11, возвращающейся к 5.7, решенной для меня

Ответ 26

У меня была такая же проблема, и после отладки оказалось, что Spring application.properties имел неправильный IP-адрес для сервера БД

spring.datasource.url=jdbc:oracle:thin:@WRONG:1521/DEV

Ответ 27

У меня была такая же ошибка,

 Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

в моем случае WAR имел внутри application.properties, которые указывали на сервер разработки.
где external application.properties указывал на нужный сервер БД.

убедитесь, что у вас нет других application.properties в classpath/jars...