【问题标题】:Hibernate 4 Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set当未设置“hibernate.dialect”时,Hibernate 4 对 DialectResolutionInfo 的访问不能为空
【发布时间】:2014-06-21 10:17:38
【问题描述】:

我正在使用 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

我尝试了很多选项并寻找在线资源,休眠文档,但找不到这里缺少的内容。任何帮助表示赞赏。

【问题讨论】:

    标签: java hibernate


    【解决方案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);
    

    更多详情请参考我的博文here

    【讨论】:

    • StandardServiceRegistryBuilder 在哪里?在哪个包中?
    • @M.S.如果您找不到StandardServiceRegistryBuilder,可能您使用的是 4.3 之前的 Hibernate。
    • 我正在使用 JBoss Tool Filal 将 Hibernate 集成到 JSF 中。因此,在从 Hibernate 角度进行配置并尝试运行新的 colsole 配置以导出域代码、Hibernate XML 映射和 DAO 代码之后,我收到了错误。我认为使用我的解决方案,SessionFactory 也正在生成,我无法通过代码访问它。
    【解决方案2】:

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

    【讨论】:

    • 我的数据库运行良好,所以这不是问题。我用命令行和 Sequel Pro IDE (Mac) 重新检查了它。
    【解决方案3】:

    删除设置方言的两行,Hibernate 4 非常出色地根据您提供的 JDBC 驱动程序和它连接的数据库确定使用哪种方言。您无需指定方言。如果您强制使用不正确或与驱动程序不完全匹配的方言(这可能是因为方言比 JDBC 驱动程序更新得更频繁),Hibernate 可能无法按预期执行。

    使用 hibernate.cfg.xml 配置 Hibernate 是使用 Hibernate 3 时的工作方式。Hibernate 4 支持 Spring 应用程序上下文中的 XML 配置。 (我假设您使用的是 Spring)它非常顺利地挂接。我建议您切换到使用配置 Hibernate 的新方法,因为您的配置文档类型是为 Hibernate 3 设置的。

    这就是您希望使用 Spring 应用程序上下文为 Hibernate 4 指定数据源的方式。

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

    【讨论】:

    • 删除两种方言后尝试,仍然有同样的异常。如果我检查异常类 JdbcServicesImpl,它会导致 MultiTenancyStrategy 配置但没有帮助。
    • 将旧的 Hibernate 配置 (Hibernate 3) 与 Hibernate 4 混合通常不会很好地结束。请参阅我的更新,但我建议您阅读如何在 Spring Application 上下文中配置 Hibernate 4。这也意味着您可以摆脱该配置类。
    • 如果您想保留映射文件(但恕我直言,在对象上使用注释更容易且更具可读性),您可以将映射文件指定到会话工厂而不是 packagesToScan 属性。
    • 感谢 Spring 集成,但我是 Hibernate 的新手并在独立应用程序中使用它,因此“仅 Hibernate”的示例会有所帮助。
    【解决方案4】:

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

    【讨论】:

    • 我会补充一点,我已经拼写了用户名和密码。在运行之前,请仔细检查 application.properties 中的设置,各位!
    【解决方案5】:

    这样就好了

    Configuration cfg = new Configuration().configure();
    
    StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
            .applySettings(cfg.getProperties()).build();
    
    SessionFactory sf = cfg.buildSessionFactory(serviceRegistry);
    
    Session session = sf.openSession();
    

    【讨论】:

      【解决方案6】:

      我在使用以下内容时遇到了这个问题:

      • Spring 框架/数据:4.1.6;
      • 春季启动:1.2.3;
      • JPA 的休眠提供程序:4.3.8。

      我在数据库端启用了 SSL 作为基于主机的身份验证机制的一部分(使用 Postgres),问题是我没有指定与包含证书的密钥库相关的 SSL JVM 属性启动应用程序时的客户端应用程序:

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

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            在我的例子中,我运行了两次配置例程。 我在一种方法中进行了自动配置(即从资源中的 xml 配置),然后我通过在另一种方法中设置属性来实现配置,但我忘记绕过前者。一旦我这样做了,错误就消失了。

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:
                  // 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();
                  

                  【讨论】:

                  • 不要使用注释部分,因为它会引发错误。
                  猜你喜欢
                  • 2014-12-20
                  • 2019-06-22
                  • 2017-04-08
                  • 2015-03-08
                  • 2018-04-04
                  • 2015-08-23
                  相关资源
                  最近更新 更多