web-dev-qa-db-fra.com

Hibernate 4 L'accès à DialectResolutionInfo ne peut pas être null si 'hibernate.dialect' n'est pas défini

J'utilise la dernière version d'Hibernate 4.3.5.Final.

Le contenu de mon fichier hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost/Test</property>
    <property name="hibernate.connection.username">pankaj</property>
    <property name="hibernate.connection.password">xxxx</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

    <mapping resource="employee.hbm.xml"/>
</session-factory>

</hibernate-configuration>

Classe d'utilitaire pour créer SessionFactory:

package com.example;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {
    try {
        // Create the SessionFactory from hibernate.cfg.xml
        Configuration configuration = new Configuration();
        configuration.configure("hibernate.cfg.xml");
        System.out.println("Hibernate Configuration loaded");

        SessionFactory sessionFactory = configuration.buildSessionFactory(new StandardServiceRegistryBuilder().build());

        return sessionFactory;
    }
    catch (Throwable ex) {
        // Make sure you log the exception, as it might be swallowed
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}
}

Lorsque je l'utilise dans ma méthode main(), j'obtiens l'exception suivante:

May 04, 2014 11:55:56 PM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Hibernate Configuration loaded
May 04, 2014 11:55:57 PM org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService
WARN: HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections
Initial SessionFactory creation failed.org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
Exception in thread "main" Java.lang.ExceptionInInitializerError
    at com.example.HibernateUtil.buildSessionFactory(HibernateUtil.Java:25)
    at com.example.HibernateUtil.<clinit>(HibernateUtil.Java:9)
    at com.example.HibernateMain.main(HibernateMain.Java:26)
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:209)
    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 com.example.HibernateUtil.buildSessionFactory(HibernateUtil.Java:18)
    ... 2 more

J'ai essayé tellement d'options et cherché des ressources en ligne, des documents d'hibernation, mais je n'ai pas trouvé ce qui manque ici. Toute aide est appréciée.

11
Pankaj

Enfin, capable de résoudre le problème, le problème réside dans la façon dont SessionFactory est créé. 

Pour commencer, le document officiel est le premier endroit où aller et je dois dire que la documentation officielle d'Hibernate ne semble pas être mise à jour avec les dernières modifications de version.

Le correctif consiste à appliquer les paramètres de configuration à l’instance StandardServiceRegistryBuilder.

// Create the SessionFactory from hibernate.cfg.xml
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
        .applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration
        .buildSessionFactory(serviceRegistry);

S'il vous plaît se référer mon blog ici pour plus de détails.

37
Pankaj

Une fois, j’ai fait face au même problème, et il s’est avéré que je n’avais pas démarré le service de base de données localement (je vois que vous utilisez également une base de données locale) .

17
geoand

Hibernate 4 supprime les deux lignes de configuration du dialecte et détermine le dialecte à utiliser en fonction du pilote JDBC que vous indiquez et de la base de données à laquelle il se connecte également. Vous n'avez pas besoin de spécifier un dialecte. Si vous forcez un dialecte incorrect ou ne correspond pas tout à fait au pilote (ce qui peut se produire lorsque les dialectes sont mis à jour plus souvent que les pilotes JDBC), Hibernate pourrait ne pas fonctionner comme prévu.

La configuration d'Hibernate à l'aide d'un fichier hibernate.cfg.xml explique comment les choses se sont déroulées avec Hibernate 3. Hibernate 4 prend en charge la configuration XML dans le contexte de l'application Spring. (Je suppose que vous utilisez Spring) Il se connecte vraiment bien. Je vous suggère d'utiliser la nouvelle méthode de configuration d'Hibernate lorsque votre doctype de configuration est défini pour Hibernate 3.

Voici comment vous souhaitez spécifier une source de données pour Hibernate 4 à l'aide du contexte d'application Spring.

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost/Test" />
    <property name="username" value="username" />
    <property name="password" value="password" />
</bean>

et ensuite vous le câblez dans votre usine de session comme ceci:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="package.where.your.annotated.objects.are" />
    <property name="hibernateProperties">
        <props>
            <!-- Uncomment this when testing -->
            <!--<prop key="hibernate.show_sql">true</prop>-->
            <prop key="hibernate.use_sql_comments">true</prop>
            <prop key="hibernate.hbm2ddl.auto">validate</prop>
        </props>
    </property>
</bean>
<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
1
JamesENL

Le même problème s’est posé à moi avec le service mysql en cours d’exécution, des informations d’identité correctes, mais le nom de la base de données a été mal orthographié. La base de données n’existe donc pas.

1
ibai

J'ai rencontré ce problème lors de l'utilisation de ce qui suit:

  • Cadre/données de printemps: 4.1.6; 
  • Botte de printemps: 1.2.3; 
  • Fournisseur Hibernate pour JPA: 4.3.8. 

J'avais activé SSL du côté de la base de données dans le cadre du mécanisme d'authentification basé sur l'hôte (à l'aide de Postgres) et le problème était que je n'avais pas spécifié les propriétés de la JVM SSL relatives au magasin de clés contenant le certificat de l'application client lors du démarrage de l'application. application:

-Djavax.net.ssl.keyStore = mykeystore.jks -Djavax.net.ssl.keyStorePassword = monPassword

Remarque: Je comprends que la réponse a déjà été donnée, mais je laisse cette réponse pour référence future.

1
R O M A N I A

Dans mon cas, j’ai exécuté deux fois la routine de configuration . J'avais une configuration automatique (c’est-à-dire une configuration de ressources XML) dans une méthode, puis j’ai implémenté une configuration en définissant les propriétés dans une autre méthode mais j’ai oublié de contourner la précédente. Dès que j'ai fait, l'erreur a disparu.

0
denispyr

Ce sera OK

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

StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
        .applySettings(cfg.getProperties()).build();

SessionFactory sf = cfg.buildSessionFactory(serviceRegistry);

Session session = sf.openSession();
0
wmmj23

À partir du code source hibernate ici , une instance de StandardServiceRegistryBuilder est utilisée pour obtenir différents services à partir de hibernate.cfg.xml, par exemple serviceRegistry.getService( JdbcServices.class ), serviceRegistry.getService( CacheImplementor.class ).

L'ancienne méthode configuration.buildSessionFactory() est comme ci-dessous:

public SessionFactory buildSessionFactory() throws HibernateException {
    Environment.verifyProperties( properties );
    ConfigurationHelper.resolvePlaceHolders( properties );
    final ServiceRegistry serviceRegistry =  new StandardServiceRegistryBuilder()
            .applySettings( properties )
            .build();
    setSessionFactoryObserver(
            new SessionFactoryObserver() {
                @Override
                public void sessionFactoryCreated(SessionFactory factory) {
                }

                @Override
                public void sessionFactoryClosed(SessionFactory factory) {
                    ( (StandardServiceRegistryImpl) serviceRegistry ).destroy();
                }
            }
    );
    return buildSessionFactory( serviceRegistry );
}
0
Evan

Vous pouvez également résoudre le problème en créant de la sorte le sesisonFactory.

SessionFactory sessionFactory = new
Configuration().configure().buildSessionFactory(
new StandardServiceRegistryBuilder().applySettings(new
Configuration().configure().getProperties()).build());
0
user2493028
// Create Configuration File and configure it.
    Configuration configuration=new Configuration();
    configuration.configure("com/sathya/config/emp.cfg.xml"); 
    // Create Service Registry
    ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
    // Create Session Object using SessionFactory Interface
    SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    Session session=sessionFactory.openSession();
    // new StandardServiceRegistryBuilder().applySettings(new Configuration().getProperties());
    // Session session=new Configuration().buildSessionFactory(new StandardServiceRegistryBuilder().build()).openSession();
0
anish kumar

Il m'est arrivé d'utiliser un nom d'utilisateur et un mot de passe incorrects après avoir changé ma chaîne de connexion d'adresse distante en localhost. J'espère que cela aidera.

0
Sky

J'avais exactement le même problème et le problème était que mon ordinateur n'était pas entré dans le fichier pg_hba.conf de la base de données postgres permettant aux clients (adresses IP) de parler avec la base

0
flipperweid