【问题标题】:Connection cannot be null when 'hibernate.dialect' not set未设置“hibernate.dialect”时,连接不能为空
【发布时间】:2012-06-28 00:20:08
【问题描述】:

在使用 spring3 设置休眠时遇到更多问题。这次是说连接是空的,因为我的 hibernate.cfg.xml 文件中没有设置方言。

这里是完整的例外:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in URL [file:war/WEB-INF/datasource-config.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:96)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:44)
    at org.springframework.test.context.TestContext.buildApplicationContext(TestContext.java:198)
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:233)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:126)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:85)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:231)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:95)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:139)
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:97)
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:67)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:172)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2270)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2266)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1735)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
    ... 29 more

这是我的 dataSource-config.xml 设置会话工厂

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
   http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/tx 
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd
      ">


    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${database.driver}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.user}" />
        <property name="password" value="${database.password} " />
    </bean>

    <bean id="mySessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="packagesToScan" value="com.jr.freedom"/>
        <property name="hibernateProperties" value="classpath:hibernate.cfg.xml"/>

    </bean>

    <!-- Declare a transaction manager -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager"
        p:sessionFactory-ref="mySessionFactory" />

</beans>

下面是hibernate.cfg.xml文件

 <?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- JDBC connection settings -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/freedom</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">password</property>

        <!-- JDBC connection pool, use Hibernate internal connection pool -->
        <property name="connection.pool_size">25</property>

        <!-- Defines the SQL dialect used in Hiberante's application -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Display and format all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create</property>

        <!-- Mapping to hibernate mapping files -->
        <!--mapping resource="org/kodejava/example/hibernate/app/Label.hbm.xml"/-->
    </session-factory>
</hibernate-configuration>

如您所见,方言正在设置中。

编辑:我的 database.properties 文件

    # DB properties file

database.url=jdbc:mysql://localhost:3306/freedom
database.driver=com.mysql.jdbc.Driver
database.user=root
database.password=password
database.maxConnections=25

编辑:这是一个完整的堆栈跟踪。访问数据库可能是问题,但我可以通过命令提示符成功访问它?

   2288 [main] WARN  org.hibernate.engine.jdbc.internal.JdbcServicesImpl  - HHH000342: Could not obtain connection to query metadata : Cannot create PoolableConnectionFactory (Access denied for user 'root'@'localhost' (using password: YES))
2289 [main] INFO  org.springframework.beans.factory.support.DefaultListableBeanFactory  - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@4f549ceb: defining beans [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0,org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#0,org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#0,org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,org.springframework.web.servlet.config.viewControllerHandlerMapping,userService,myDataSource,mySessionFactory,transactionManager,propertyConfigurer,org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0,viewResolver,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter#0,hello,userController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
2289 [main] DEBUG org.springframework.beans.factory.support.DisposableBeanAdapter  - Invoking destroy method 'close' on bean with name 'myDataSource'
2289 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Retrieved dependent beans for bean '(inner bean)#14': [org.springframework.web.servlet.config.viewControllerHandlerMapping]
2289 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Retrieved dependent beans for bean '(inner bean)#8': [org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0]
2289 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Retrieved dependent beans for bean '(inner bean)#1': [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0]
2290 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Retrieved dependent beans for bean '(inner bean)': [org.springframework.web.servlet.handler.MappedInterceptor#0]

【问题讨论】:

  • 我不认为你可以调试 xml 文件。我已经尝试调试实际的 java 代码,但它从未到达它,因为它仍在尝试组织 bean 及其应用程序上下文
  • Spring 和 Hibernate 也是用“实际的 Java 代码”编写的。堆栈跟踪揭示了构建 SessionFactory 所涉及的类和方法。只需在此处设置几个断点即可找出问题所在?
  • 抱歉,除非您将整个 lib 类项目导入到您的项目中,否则您无法调试库。像“org.springframework.beans.factory”这样的东西不能通过库来调试。
  • 当然可以。是的,库的源代码对此很有用。像 eclipse/maven 这样配置良好的 IDE/构建工具会自动下载依赖的源代码。如果做不到这一点,您也可以手动附加源。简而言之,在宣布不可能的事情之前,请查阅 IDE 的文档。

标签: java spring hibernate


【解决方案1】:

数据库连接丢失。在 hibernate.cfg.xml 文件中添加这样的行

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">
    jdbc:mysql://localhost:3306/your_database
</property>
<property name="connection.username">your_user</property>
<property name="connection.password">your_password</property>

(如果您的计算机上没有安装数据库,请替换 localhost,并在我的示例中设置以your_ 开头的值)。

【讨论】:

  • 好酷。我在 .properties 文件中定义了这些属性。这是不正确的吗?此外,数据库连接是在我的一个名为 datasource 的 bean 上定义的
  • Hibernate 使用与您不同的属性(Hibernate 使用connection.url,您使用的是database.url)。您的属性文件可能是用于 jdbc 还是用于 spring(我不喜欢 spring)?我认为混合这两种类型的配置文件是个问题,因为这样 Hibernate 只能看到其中的一半。
  • 它的春天。我遵循了 spring+hibernate 的指南,该指南具有完全相同的设置,并且还阅读了 spring in action book,它使用了一个与 sessionFactory bean 挂钩的 dataSource bean。这就是我想要做的。将数据源和休眠配置分开,这样我就可以创建自定义构建目标,这些目标会根据我将构建的环境自动构建和转储适当的数据库/hbernate 设置
【解决方案2】:

我在使用 JPA 时遇到了这个错误,然后我将这一行添加到 application.properties:

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

基于这篇文章:org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。从 Apache Commons 数据源切换:

    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${database.driver}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.user}" />
        <property name="password" value="${database.password} " />
    </bean>
    

    到 C3P0:

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://ipadress:3306/schema" />
        <property name="user" value="root" />
        <property name="password" value="abc" />
    </bean>
    

    让我的问题消失了。也许有人可以解释原因,我很高兴它有效,并想分享我所知道的一点点:)

    【讨论】:

      【解决方案4】:

      我认为是没有在您的应用程序中加载您的hibernate.cfg.xml 文件的问题。

      我也遇到了同样的问题。我在我的项目中尝试了以下代码:

      Configuration cfg = new Configuration();
      cfg.configure("hibernate.cfg.xml");
      

      然后它运行良好。 希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        我你正在使用休眠和InnoDB 为什么不将hibernate.dialect 设置为org.hibernate.dialect.MySQL5org.hibernate.dialect.MySQL

        hibernate.connection.url的连接属性。

        【讨论】:

        • 我没有使用 InnoDB。只使用标准的mysql5。 hibernate.connection.url 也已经设置:jdbc:mysql://localhost:3306/freedom
        • 但是属性是connection.url。
        • 啊,我明白你的意思了。我只是更改了它并没有解决问题。没有设置方言的同样问题
        【解决方案6】:

        我认为你没有配置 hibernate.cfg.xml。

        Configuration configuration = new Configuration();
        configuration.configure("hibernate.cfg.xml");
        SessionFactory factory = configuration.buildSessionFactory();
        

        【讨论】:

          【解决方案7】:

          我认为您的 datasource-config.xml 不在类路径中

          而不是将这个文件放在WEB-INF/datasource-config.xml

          复制到WEB-INF/classes/datasource-config.xml

          【讨论】:

          • 您在属性文件中指定的密码不正确。我认为之前的问题已经解决了。
          • 我再次检查了密码并确保其正确。显然我没有在这段代码 sn-p 中发布真实密码,但我用来通过 cmd 登录的密码适用于 root 用户,我在属性和 hibernate.cfg 文件中设置了相同的密码
          【解决方案8】:

          如果您的 mysql-connector 版本和 mysql-installer 版本不同,则会出现此问题。

          在内部它会抛出原因:

          com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:客户端不支持服务器请求的认证协议;考虑升级 MySQL 客户端。

          所以你需要让你的 mysql-connector 版本和 mysql-installer 版本相同...

          【讨论】:

            【解决方案9】:

            在persistence.xml文件中添加以下内容,

            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
            

            【讨论】:

              【解决方案10】:

              您没有发布会话工厂初始化代码。但我想这与this one 有同样的问题

              从 Hibernate 4.3.2.Final 开始,引入了 StandardServiceRegistryBuilder。请按照此顺序进行初始化,例如:

              Configuration configuration = new Configuration();
              configuration.configure("com/jeecourse/config/hibernate.cfg.xml");
              
              ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
                      configuration.getProperties()).build();
              sessionFactory = configuration.buildSessionFactory(serviceRegistry);
              

              请仔细检查您的代码。

              【讨论】:

                【解决方案11】:

                我认为您不会像下面这样创建配置。

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

                最好的

                【讨论】:

                  【解决方案12】:

                  我认为在您创建了这样的配置对象后卸载 hibernate.cfg.xml 文件会导致错误:

                  Configuration config = new Configuration();
                  config.configure("hibernate.cfg.xml");
                  

                  【讨论】:

                    【解决方案13】:

                    我遇到了同样的问题,问题是我的计算机没有输入到允许哪些客户端(IP 地址)与数据库对话的 postgres 数据库的 pg_hba.conf 中。

                    顺便说一句:其他用户告诉他们如果他们只是忘记在本地启动数据库服务也会引发错误

                    【讨论】:

                      【解决方案14】:

                      单独创建ServiceRegistry 实例并将其传递给buildSessionFactory 可能会导致此错误。尝试如下创建SessionFactory 实例:

                      private static SessionFactory factory;
                      factory = cfg.buildSessionFactory(
                                new ServiceRegistryBuilder().applySettings(cfg.getProperties())
                               .buildServiceRegistry());
                      

                      【讨论】:

                        【解决方案15】:

                        我们最近在我们的一个部署中遇到了同样的问题,因为我们也在使用休眠,并且 dialect is null 是一个模糊的错误。 我使用的是连接字符串本身,并进行了以下更改以使其工作

                        connectionUrl :- jdbc:mysql://127.0.0.1:3306/{{dbName}}?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false

                        步骤我们如何解决它 1) 我们使用 JDBC 驱动程序运行简单的 DB 连接,这将导致时区异常。 2)我们发现了时区问题,必须在连接字符串中添加更多属性,如上所示。 3) 我们还添加了 2 个其他属性,因为它仍然无法正常工作。

                        方言未设置含糊不清占用了我们很多时间,希望对您有所帮助。

                        【讨论】:

                          【解决方案16】:

                          这对我有用,添加了方言属性...

                          <?xml version="1.0" encoding="UTF-8"?>
                          <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
                              <persistence-unit name="project_name" transaction-type="RESOURCE_LOCAL">
                                  <properties>
                                      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/"/>
                                      <property name="javax.persistence.jdbc.user" value="root"/>
                                      <property name="javax.persistence.jdbc.password" value="root"/>
                                      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
                                      <property name="javax.persistence.schema-generation.drop-source" value="script-then-metadata"/>
                                      <property name="dialect" value="org.hibernate.dialect.MySQLDialect"/>  
                                  </properties>
                              </persistence-unit>
                          </persistence>
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2014-06-29
                            • 2019-06-22
                            • 2014-12-20
                            • 2014-06-21
                            • 2021-01-19
                            相关资源
                            最近更新 更多