Hibernate 4 Доступ к DialectResolutionInfo не может быть нулевым, если "hibernate.dialect" не установлен

Я использую последнюю версию Hibernate 4.3.5.Final.

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

Класс полезности для создания 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;
}
}

Когда я использую его в моем методе main(), я получаю следующее исключение:

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

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

Ответ 1

Наконец, чтобы исправить проблему, проблема связана с тем, как создается SessionFactory.

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

Исправление - применить настройки конфигурации к экземпляру 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);

Пожалуйста, обратитесь к моему сообщению в блоге здесь для более подробной информации.

Ответ 2

Однажды я столкнулся с одной и той же проблемой, и оказалось, что проблема в том, что я не запускал службу базы данных локально (что я вижу, вы также используете локальную базу данных). Это просто!!!

Ответ 3

Удалите обе строки установки диалекта, Hibernate 4 выполняет фантастическую работу по определению того, какой диалект использовать на основе драйвера JDBC, который вы ему даете, и базы данных, к которой он подключается. Вам не нужно указывать диалект. Если вы наводите диалект, который является неправильным или не совсем соответствует драйверу (что может случиться, когда диалекты обновляются чаще, чем у JDBC-драйверов) Hibernate может работать не так, как ожидалось.

Настройка Hibernate с помощью hibernate.cfg.xml - это то, как это было сделано при использовании Hibernate 3. Hibernate 4 поддерживает XML-конфигурацию в контексте приложения Spring. (Я предполагаю, что вы используете Spring). Он перехватывает действительно плавно. Я предлагаю вам перейти на новый метод настройки Hibernate, так как ваш тип конфигурации конфигурации настроен для Hibernate 3.

Вот как вы хотите указать источник данных для Hibernate 4, используя контекст приложения 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>

а затем подключите его к сеансу factory следующим образом:

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

Ответ 4

Такая же проблема возникла у меня с запущенной службой mysql, верными учетными данными, но имя базы данных было написано с ошибкой, поэтому в основном базы данных не существовало.

Ответ 5

Я столкнулся с этой проблемой при использовании следующего:

  • Spring Framework/Data: 4.1.6;
  • Spring Boot: 1.2.3;
  • Поставщик Hibernate для JPA: 4.3.8.

У меня был включен SSL на стороне базы данных как часть механизма аутентификации на основе хоста (с использованием Postgres), и проблема заключалась в том, что я не указал свойства SSL JVM, связанные с хранилищем ключей, содержащим сертификат клиентского приложения при запуске приложения:

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

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

Ответ 6

Это будет ОК

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

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

SessionFactory sf = cfg.buildSessionFactory(serviceRegistry);

Session session = sf.openSession();

Ответ 7

Из исходного кода спящего режима здесь экземпляр StandardServiceRegistryBuilder используется для получения разных сервисов из hibernate.cfg.xml, например serviceRegistry.getService( JdbcServices.class ), serviceRegistry.getService( CacheImplementor.class ).

Старый метод configuration.buildSessionFactory() выглядит следующим образом:

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

Ответ 8

Вы также исправляете проблему, создавая sesisonFactory таким образом.

SessionFactory sessionFactory = new
Configuration().configure().buildSessionFactory(
new StandardServiceRegistryBuilder().applySettings(new
Configuration().configure().getProperties()).build());

Ответ 9

В моем случае я дважды запускал процедуру настройки. У меня была автоматическая настройка (т.е. Конфигурация из xml в ресурсах) одним методом, затем я реализовал конфигурацию, установив свойства другим способом, но я забыл обходить первое. Как только я это сделал, ошибка исчезла.

Ответ 10

У меня была точно такая же проблема, и проблема заключалась в том, что мой компьютер не был введен в pg_hba.conf базы данных postgres, что позволяет клиенту (IP-адресам) разрешать говорить с базой данных

Ответ 11

Случилось со мной, что я использовал неправильное имя пользователя и пароль после того, как изменил строку подключения с удаленного адреса на localhost. Надеюсь, это поможет.