web-dev-qa-db-fra.com

org.hibernate.HibernateException: L'accès à DialectResolutionInfo ne peut pas être null lorsque aucun 'hibernate.dialect' n'est défini

J'essaie de lancer une application Spring-Boot utilisant hibernate via spring-jpa, mais j'obtiens l'erreur

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

mon fichier pom.xml est le suivant:

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

ma configuration hibernate est que (la configuration du dialecte est dans la dernière méthode de cette classe):

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

qu'est-ce que je fais mal ici?

142
Kleber Mota

Commencez par supprimer toute votre configuration. Spring Boot le démarrera pour vous. Si vous avez vraiment besoin de SessionFactory au lieu de EntityManagerFactory, ajoutez HibernateJpaSessionFactoryBean

Assurez-vous que vous avez un application.properties dans votre chemin de classe et ajoutez les propriétés suivantes.

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

Si vous avez vraiment besoin d'accéder à un SessionFactory et qu'il s'agit essentiellement de la même source de données, vous pouvez procéder comme suit (qui est également documenté ici bien que pour XML, pas JavaConfig).

@Configuration        
public class HibernateConfig {

    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
         HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
         factory.setEntityManagerFactory(emf);
         return factory;
    }
}

De cette façon, vous avez à la fois un EntityManagerFactory et un SessionFactory.

En supposant que vous ayez une classe avec une méthode main avec @EnableAutoConfiguration, vous n'avez pas besoin de l'annotation @EnableTransactionManagement car celle-ci sera activée par Spring Boot pour vous. Une classe d'application de base dans le package com.spring.app devrait suffire.

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {


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

} 

Quelque chose comme ça devrait suffire à faire détecter toutes vos classes (y compris les entités et les référentiels Spring Data).

Je suggérerais également de supprimer la dépendance commons-dbcp car cela permettrait à Spring Boot de configurer une implémentation plus rapide et plus robuste HikariCP .

151
M. Deinum

Je rencontrais un problème similaire lors du démarrage de l'application (à l'aide de Spring Boot) avec le serveur de base de données indisponible .

Hibernate peut déterminer le bon dialecte à utiliser automatiquement, mais pour ce faire, une connexion directe à la base de données est nécessaire.

107
mhnagaoka

J'ai eu cette erreur quand ma base de données n'a pas été créée. Après avoir créé la base de données manuellement, cela a bien fonctionné.

16
ACV

J'ai également fait face à un problème similaire. Mais, cela était dû au mot de passe invalide fourni. En outre, je voudrais dire que votre code semble être un code de style ancien utilisant le printemps. Vous avez déjà mentionné que vous utilisez un système de démarrage à ressort, ce qui signifie que la plupart des choses seront configurées automatiquement pour vous. Le dialecte hibernate sera automatiquement sélectionné en fonction du pilote de base de données disponible sur le chemin de classe, ainsi que des informations d'identification valides pouvant être utilisées pour tester correctement la connexion. S'il y a un problème avec la connexion, vous rencontrerez encore la même erreur. seulement 3 propriétés nécessaires dans 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

ajouter spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect dans le fichier application.properties

10
alpine

J'ai rencontré le même problème et mon problème était que la base de données à laquelle je tentais de me connecter n'existait pas.

J'ai créé la base de données, vérifié l'URL/chaîne de connexion et reran et tout a fonctionné comme prévu.

6
Eric B.

Assurez-vous que votre application.properties a toutes les informations correctes: (j'ai changé mon port de base de données de 8889 à 3306 cela a fonctionné)

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

cela se produit parce que votre code n'est pas capable de connecter la base de données. Assurez-vous que vous avez le pilote mysql et nom d'utilisateur, mot de passe correct. 

3
user7169604

Assurez-vous d'avoir votre base de données dans votre pom, comme OP. C'était mon problème.

2
obesechicken13

Dans mon cas, l'utilisateur n'a pas pu se connecter à la base de données. Si aura le même problème si le journal contient un avertissement juste avant l'exception:

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

Mon problème était que la base de données intégrée était déjà connectée. fermer la connexion

2
doesnt_matter

J'ai eu ce problème quand Eclipse n'a pas pu trouver le pilote JDBC. Je devais faire un rafraichissement de l’éclipse pour obtenir ce travail.

1
Kannan Ramamoorthy

Au printemps, démarrez jpa Java config pour étendre JpaBaseConfiguration et implémenter ses méthodes abstraites. 

@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

J'ai aussi eu ce problème. Dans mon cas, c'était parce qu'aucune subvention n'avait été attribuée à un utilisateur de MySQL. L'attribution aux utilisateurs de MySQL des autorisations que mon application utilise a résolu le problème:

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

Cela m'est arrivé parce que je n'avais pas ajouté la conf.configure(); avant de commencer la session: 

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

J'ai rencontré le même problème: la base de données que j'essayais de connecter n'existait pas. J'ai utilisé jpa.database=default (ce qui, je suppose, signifie qu'il essaiera de se connecter à la base de données puis de sélectionner automatiquement le dialecte). Une fois que j'ai démarré la base de données, cela a fonctionné sans aucun changement.

0
Avishekh Tewari

Si l'erreur précédente dans le journal était la suivante: "ERREUR - HikariPool-1 - jdbcUrl est requis avec driverClassName" Dans ce cas, la solution consiste à réécrire "url" en "jdbc-url", comme suit: Base de données application.yml pour le démarrage Spring à partir de applications.properties

0
JanBrus

J'ai eu la même erreur après avoir utilisé la génération de code Hibernate 

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

alors le hibernate.cfg.xml a été créé dans le /src/main/Java.__, mais sans les paramètres de connexion .__ après l'avoir supprimé - mon problème a été résolu 

0
RMagen

J'ai eu le même problème et cela était dû à l'impossibilité de se connecter à l'instance de base de données. Recherchez l'erreur d'hibernation HHH000342 dans le journal au-dessus de cette erreur, elle devrait vous donner une idée de l'endroit où la connexion à la base de données échoue (nom d'utilisateur/mot de passe incorrect, adresse URL, etc.).

0
Farouk

Pour ceux qui travaillent avec AWS MySQL RDS, cela peut se produire lorsque vous ne pouvez pas vous connecter à la base de données. Accédez au paramètre AWS Security Groups pour MySQL RDS et modifiez la règle IP entrante en actualisant MyIP. 

J'ai fait face à ce problème et ce qui précède a résolu le problème pour moi.

0
Ajitesh

Assurez-vous que vous avez entré des détails valides dansapplication.propertieset que votre serveur de base de données est disponible. Par exemple, lorsque vous vous connectez avec MySQL, vérifiez siXAMPPfonctionne correctement.

0
Lahiru Gamage

Idem mais dans un JBoss WildFly AS .

Résolu avec les propriétés dans mon 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>

J'ai eu la même erreur,

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

dans mon cas, le WAR avait application.properties à l'intérieur du serveur de développement
où application externe.properties pointait vers le bon serveur de base de données.

assurez-vous que vous n'avez pas d'autre application.properties dans le classpath/jars ...

0
user648026

Si vous utilisez cette ligne:

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

assurez-vous que env.getProperty("hibernate.dialect") n'est pas nul.

0
zygimantus

J'ai fait face à ce problème en raison de la version Mys.11 8.0.11 qui est revenue à la version 5.7 résolue pour moi

0
Gautam Yadav

J'ai eu le même problème et après le débogage, il s'est avéré que Spring application.properties avait une adresse IP incorrecte pour le serveur de base de données.

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