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

Posted

技术标签:

【中文标题】当未设置“hibernate.dialect”时,Hibernate 4 对 DialectResolutionInfo 的访问不能为空【英文标题】:Hibernate 4 Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set 【发布时间】: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

我尝试了很多选项并寻找在线资源、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.你试过谷歌吗? docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/boot/… @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”的示例会有所帮助。 这不对,检查***.com/questions/18792185/…【参考方案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();

【讨论】:

不要使用注释部分,因为它会引发错误。

以上是关于当未设置“hibernate.dialect”时,Hibernate 4 对 DialectResolutionInfo 的访问不能为空的主要内容,如果未能解决你的问题,请参考以下文章

org.hibernate.HibernateException:当未设置“hibernate.dialect”时,对 DialectResolutionInfo 的访问不能为空

org.hibernate.HibernateException:当未设置“hibernate.dialect”时,对 DialectResolutionInfo 的访问不能为空

休眠代码生成:org.hibernate.HibernateException:没有可用连接时必须设置“hibernate.dialect”

当没有 Internet 连接时,Hibernate 给出错误错误,因为“当 'hibernate.dialect' 未设置时,访问 DialectResolutionInfo 不能为空”

hibernate设置各种数据库方言

HibernateAccess to DialectResolutionInfo cannot be null when ‘hibernate.dialect‘ not set