簡體   English   中英

Hibernate 4未設置'hibernate.dialect'時,對DialectResolutionInfo的訪問不能為空

[英]Hibernate 4 Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

我正在使用Hibernate最新版本4.3.5.Final

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

我已經嘗試了很多選項,並尋找在線資源,hibernate文檔,但無法找到這里缺少的東西。 任何幫助表示贊賞。

最后能夠解決問題,問題在於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);

請參閱我的博客文章在這里了解更多詳情。

我曾經遇到過完全相同的問題,事實證明問題是我沒有在本地啟動數據庫服務(我發現你也在使用本地數據庫)。 那簡單!!!

刪除設置方言的兩行,Hibernate 4根據您提供的JDBC驅動程序以及它連接的數據庫確定要使用哪種方言。 您不需要指定方言。 如果強制使用不正確的方言或與驅動程序不匹配的方言(這可能會發生,因為方言比JDBC驅動程序更頻繁地更新)Hibernate可能無法按預期執行。

使用hibernate.cfg.xml配置Hibernate是使用Hibernate時的工作方式3. Hibernate 4支持Spring Application上下文中的XML配置。 (我假設你正在使用Spring)它非常順利地掛鈎。 我建議您切換到使用配置Hibernate的新方法,因為您為Hibernate 3設置了配置文檔類型。

這是您希望使用Spring應用程序上下文為Hibernate 4指定dataSource的方式。

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

然后你將它連接到會話工廠,如下所示:

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

運行mysql服務時出現同樣的問題,正確的憑據,但數據庫名稱拼寫錯誤,所以基本上數據庫不存在。

使用以下內容時遇到此問題:

  • Spring Framework / Data:4.1.6;
  • Spring Boot:1.2.3;
  • JPA的Hibernate提供程序:4.3.8。

我在數據庫端啟用了SSL ,作為基於主機的身份驗證機制的一部分(使用Postgres),問題是我沒有在啟動時指定與包含客戶端應用程序證書的密鑰庫相關的SSL JVM屬性。應用:

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

注意:我理解答案已經得到解答,但我將留下這個答案以備將來參考。

這沒關系

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

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

SessionFactory sf = cfg.buildSessionFactory(serviceRegistry);

Session session = sf.openSession();

這里的hibernate源代碼,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 );
}

您也可以通過這種方式創建sesisonFactory來解決問題。

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

在我的情況下,我運行了兩次配置例程。 我在一個方法中進行了自動配置(即從資源中的xml配置),然后通過在另一個方法中設置屬性來實現配置,但我忘記繞過前者。 我一做到,錯誤消失了。

我有完全相同的問題,問題是,我的計算機沒有輸入postgres數據庫的pg_hba.conf,允許允許哪些客戶端(IP-Adresses)與數據庫通話

在我將連接字符串從遠程地址更改為localhost后,我使用了錯誤的用戶名和密碼。 希望這會有所幫助。

// 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM