it-swarm.com.ru

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

что я тут не так делаю?

142
Kleber Mota

Сначала удалите все ваши настройки 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, и это в основном для того же источника данных, то вы можете сделать следующее (что также документировано here , хотя для 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 должно быть достаточно.

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

151
M. Deinum

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

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

107
mhnagaoka

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

16
ACV

Я также столкнулся с подобной проблемой. Но это произошло из-за предоставленного неверного пароля. Кроме того, я хотел бы сказать, что ваш код выглядит как код старого стиля с использованием 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=
14
Pankaj Soni

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

10
alpine

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

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

6
Eric B.

Убедитесь, что ваш application.properties содержит всю правильную информацию: (Я изменил свой порт БД с 8889 на 3306, он работал)

 db.url: jdbc:mysql://localhost:3306/test
3
Vikram S

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

3
user7169604

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

2
obesechicken13

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

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

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

2
doesnt_matter

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

1
Kannan Ramamoorthy

При весенней загрузке для конфигурации Java jpa вам необходимо расширить 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");
    }

}
1
Yaroslav

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

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

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

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

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

0
Avishekh Tewari

Если предыдущая ошибка в журнале была такой: «ОШИБКА - HikariPool-1 - требуется jdbcUrl с driverClassName» , То решение состоит в том, чтобы переписать «url» в «jdbc-url» в соответствии с этим: База данных application.yml для загрузки Spring из application.properties

0
JanBrus

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

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

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

0
RMagen

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

0
Farouk

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

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

0
Ajitesh

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

0
Lahiru Gamage

То же, но в 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>
0
Alejandro Teixeira Muñoz

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

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

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

0
zygimantus

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

0
Gautam Yadav

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

spring.datasource.url=jdbc:Oracle:thin:@WRONG:1521/DEV
0
user648026