Hibernate 4未设置'hibernate.dialect'时,对DialectResolutionInfo的访问不能为空

时间:2014-05-05 07:20:49

标签: java hibernate

我使用的是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文档但是找不到这里缺少的东西。任何帮助表示赞赏。

12 个答案:

答案 0 :(得分:37)

最终能够解决问题,问题在于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);

请参阅我的博文here了解更多详情。

答案 1 :(得分:17)

我曾遇到过完全相同的问题,结果发现问题是我没有在本地启动数据库服务(我发现你也在使用本地数据库)。 那很简单!!!

答案 2 :(得分:1)

删除设置方言的两行,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>

答案 3 :(得分:1)

我运行mysql服务时出现同样的问题,正确的凭据,但数据库名称拼写错误,所以基本上数据库不存在。

答案 4 :(得分:1)

使用以下内容时遇到此问题:

  • 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

注意:我知道答案已经得到解答,但我将留下这个答案以供将来参考。

答案 5 :(得分:0)

这没关系

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

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

SessionFactory sf = cfg.buildSessionFactory(serviceRegistry);

Session session = sf.openSession();

答案 6 :(得分:0)

从hibernate源代码here,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 );
}

答案 7 :(得分:0)

你也可以通过这种方式创建sesisonFactory来解决问题。

    def idList = ClassA.createCriteria().list() {
        projections { 
            distinct("id")
            property("name")               
        }

        createAlias("firstsList", "fl", JoinType.LEFT_OUTER_JOIN)
        createAlias("SecondsList", "sl", JoinType.LEFT_OUTER_JOIN)
        or {                 
            eq("fl.login", "John")             
            eq("sl.login", "John")                                
        }

        order("name", "desc")
    }

答案 8 :(得分:0)

在我的情况下,我运行了两次配置例程。 我在一个方法中进行了自动配置(即从资源中的xml配置),然后通过在另一个方法中设置属性来实现配置,但我忘记绕过前者。我一做到这一点,就错了。

答案 9 :(得分:0)

我遇到了完全相同的问题,问题是,我的计算机没有输入postgres数据库的pg_hba.conf中,该数据库允许允许哪些客户端(IP-Adresses)与数据库对话

答案 10 :(得分:0)

在我将连接字符串从远程地址更改为localhost后,我使用了错误的用户名和密码。希望这会有所帮助。

答案 11 :(得分:0)

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