web-dev-qa-db-fra.com

HibernateException: l'accès à DialectResolutionInfo ne peut pas être nul si 'hibernate.dialect' n'est pas défini

Création d'un projet de test Hibernate à l'aide de maven.

quand je lance le projet, il génère une exception:

org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService
WARN: HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections
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:89)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.Java:206)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.Java:178)
at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.Java:1885)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1843)
at org.hibernate.hibernatetest.App.main(App.Java:33)
Exception in thread "main" Java.lang.NullPointerException
at org.hibernate.hibernatetest.App.main(App.Java:51) 

Mais dans la classe principale, les propriétés requises sont définies.ne sais pas pourquoi le programme génère une exception.

Classe principale:

public class App {

public static void main(String[] args) {
    Configuration configuration;
    ServiceRegistry serviceRegistry;
    SessionFactory sessionFactory;
    Session session = null;
    try {
        configuration = new Configuration();


        serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        configuration.setProperty("hibernate.dialect ", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
        configuration.setProperty("hibernate.connection.url ", "jdbc:sqlite:TailorDB.db");
        configuration.setProperty("hibernate.connection.driver_class ", "org.sqlite.JDBC");
        configuration.setProperty("hibernate.connection.username ", "");
        configuration.setProperty("hibernate.connection.password ", "");
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);

        session = sessionFactory.openSession();

        CustomerModel c = new CustomerModel();
        c.setID(5);
        c.setNIC_Number("691201631345");
        c.setFirstName("Zee");
        c.setNumber("55225522");
        c.setLastName("Jan");
        c.setCustomerCode("Zee-123");

        session.beginTransaction();
        session.save(c);
        session.getTransaction().commit();
    } catch (HibernateException e) {
        e.printStackTrace();
    } finally {
        session.close();
    }
}
}

Dans le fichier POM:

<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.xerial</groupId>
        <artifactId>sqlite-jdbc</artifactId>
        <version>3.7.2</version>
    </dependency>
    <dependency>
        <groupId>com.applerao</groupId>
        <artifactId>hibernatesqlite</artifactId>
        <version>1.0</version>
    </dependency>
</dependencies>

Toute idée où le problème peut être ??

CustomerModel cLass:

@Entity
@Table(name = "Customer")

public class CustomerModel {

@Id
@GeneratedValue
@Column(name = "c_id")
int ID;
@Column(name = "c_code")
String customerCode;
@Column(name = "c_fname")
String firstName;
@Column(name = "c_mname")
String middleName;
@Column(name = "c_lname")
String lastName;
@Column(name = "c_nic")
String NIC_Number;
@Column(name = "c_email")
String email;
@Column(name = "c_pnumber")
String number;
}
13
Sameer Azeem

Vous n'avez pas initialisé correctement la configuration, serviceRegistry et sessionFactory ..__ De Hibernate 4.3.2.Final, StandardServiceRegistryBuilder est présenté. Veuillez suivre cet ordre pour initialiser, par exemple.

    Configuration configuration = new Configuration();
    configuration.configure("com/jeecourse/config/hibernate.cfg.xml");

    ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
            configuration.getProperties()).build();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);

Donc, dans votre code, vous avez manqué l'étape: configuration.configure().

24
Jimmy

Cela semble être une vieille question, mais maintenant, lorsque j'utilise la version 4.3.1 finale d'Hibernate, j'ai également rencontré ce problème. Après avoir lu de nombreuses réponses, il semblait qu’ils n’en avaient vraiment pas tenu compte dans la documentation, mais j’ai parcouru la documentation et je pense qu’ils ont les informations nécessaires. Il n'est pas nécessaire que la configuration de veille prolongée doive être dans un fichier .properties, mais elle peut également être dans un fichier xml.

Assurez-vous simplement que vous appelez configure() avant d'appeler build() sur l'instance de StandardServiceRegistryBuilder. En effet, configure () charge réellement la configuration à partir du fichier cfg.xml par défaut et la construction l’utilise réellement.

Pour comprendre cela, vous pouvez faire une chose ... avant d'invoquer configure() .... invoquer getSettings() sur l'intance de StandardServiceRegistryBuilder et l'imprimer ... c'est une carte.

Vous ne verrez pas les propriétés d'hibernation que vous avez mentionnées dans le fichier cfg.xml

Maintenant, appelez configure() et imprimez la carte getSettings() .... vous verrez ... vous avez toutes vos propriétés.

7
Omkar Patkar

Dans hibernate 4.3, il semble nécessaire d'utiliser hibernate.properties pour config, Utiliser hibernate.cfg.xml uniquement pour inclure les fichiers .hbm.xml, , Voici la solution:

dans classpath, ajoutez un fichier: hibernate.properties et faites toutes les config ici, e.g:

 # jdbc connecition 
 hibernate.connection.driver_class = org.postgresql.Driver 
 hibernate.connection.url = jdbc: postgresql: // hôte local: 5432/xdm 
 hibernate.connection.username = postgres 
 hibernate.connection.password = 123456 

 # dialecte 
 hibernate.dialect = org.hibernate.dialect.PostgreSQL82Dialect 

 # c3p0 
 hibernate.c3p0.min_size = 2 
 hibernate.c3p0.max_size = 5 
 hibernate.c3p0.max_statements = 20 
 hibernate.jdbc.batch_size = 10 
 hibernate.c3p0.timeout = 300 
 hibernate.c3p0. 
 hibernate.c3p0.testConnectionOnCheckout = true 

 # autre 
 hibernate.show_sql = true 
 hibernate.max_fetch_depth = 3 

puis, dans hibernate.cfg.xml, incluez uniquement les fichiers .hbm.xml, e.g:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- mapping files -->
        <mapping resource="hibernate/model/Event.hbm.xml" />
    </session-factory>
</hibernate-configuration>

astuce: le document officiel n'a donné aucune astuce comme celle-ci, je pense que c'est une très mauvaise chose.

4
Eric Wang

Définissez les propriétés de configuration avant d'appliquer les propriétés de configuration aux paramètres de StandardServiceRegistryBuilder

    configuration.setProperty("hibernate.dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
    configuration.setProperty("hibernate.connection.url", "jdbc:sqlite:TailorDB.db");
    configuration.setProperty("hibernate.connection.driver_class", "org.sqlite.JDBC");
    configuration.setProperty("hibernate.connection.username", "");
    configuration.setProperty("hibernate.connection.password", "");
    serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);

En outre, il semble y avoir un espace à la fin des clés de propriété lors de leur définition. Veuillez les supprimer.

Sur la base du link , essayez de changer ceci

configuration.setProperty("hibernate.dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");

à

configuration.setProperty("dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
1
Keerthivasan

Voici ce que j'ai fait pour effectuer toutes les configurations dans le code sans hibernate.cfg.xml ni hibernate.properties. Testé avec la version 4.3.8.Final d'Hibernate. J'espère que ce serait utile.

    Configuration configuration = new Configuration();

    Properties properties = new Properties();

    properties.put(Environment.DRIVER,
            com.mysql.jdbc.Driver.class.getName());
    properties.put(Environment.USER, "root");
    properties.put(Environment.PASS, "root");
    properties.put(Environment.HBM2DDL_AUTO, "create");
    properties.put(Environment.DIALECT, MySQL5Dialect.class.getName());
    properties
            .put(Environment.URL, "jdbc:mysql://localhost/hibernate_test");
    properties.put(Environment.SHOW_SQL, true);

    configuration.setProperties(properties);

    configuration.addAnnotatedClass(Stock.class).addAnnotatedClass(
            StockDailyRecord.class);

    ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
            .applySettings(configuration.getProperties()).build();

    SessionFactory sessionFactory = configuration
            .buildSessionFactory(serviceRegistry);
0
alijandro

L'objet de configuration lisait toutes les propriétés du fichier hibernate.cfg.xml. Mais l'objet StandardServiceRegistryBuilder n'utilisait pas ces propriétés.

Cette solution a fonctionné pour moi. La déclaration ci-dessous est essentielle pour faire ce travail:

ServiceRegistry serviceRegistry = 
    new StandardServiceRegistryBuilder().applySettings(
        configuration.getProperties()).build();

Solution complète:

package demo.jaxrs.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
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 {
            Configuration configuration = new Configuration();
            configuration.configure();
            System.out.println("Properties: " + configuration.getProperties());
            StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties()).build();

            // Create the SessionFactory from hibernate.cfg.xml
            return configuration.buildSessionFactory(serviceRegistry);

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

}
0
zaki

Merci pour la solution. En quelque sorte, le 4.3.5 ne prend pas les informations de connexion (dialecte) du fichier hibernate.cfg.xml, utilisez le fichier hibernate.properties pour cela. 

0
Dinesh Khetarpal

Cela peut également arriver si le dialecte ne peut pas se connecter pour une autre raison, telle que le mot de passe a expiré.

Vérifiez toutes les exceptions antérieures pouvant révéler la cause.

0
sweetfa

Comme il le dit à propos de ServiceRegistry:

package org.phenix.hibernate.main;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {

            Configuration configuration = new Configuration();
            configuration.configure("hibernate.cfg.xml");

            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties()).build();

            // Create the SessionFactory from hibernate.cfg.xml
            return configuration.buildSessionFactory(serviceRegistry);
        } 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;
    }

}
0
Abdourahmane FALL