【问题标题】:Issue : Connection cannot be null when 'hibernate.dialect' not set问题:未设置“hibernate.dialect”时,连接不能为空
【发布时间】:2016-01-11 17:07:58
【问题描述】:

尝试使用 Microsoft 驱动程序通过 Datasource 将 Spring 代码与 SQL Server 数据库连接。

application-context.xml:

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

属性配置:

database.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
database.url=jdbc\:jtds\:sqlserver\://DB_ip:DB_Port/MyDB;instance=Some_Ins;integratedSecurity=true
database.username=
database.password=

错误

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in file [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.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
  ...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in file [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:1512)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)

已编辑

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:170)
            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.Configuration.buildTypeRegistrations(Configuration.java:1797)
            at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1755)
            at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1840)
            at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:247)
            at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:373)
            at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:358)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1571)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1509)
            ... 39 more

无法确定根本原因..

【问题讨论】:

  • 为什么要投反对票..请解释一下,如果有什么遗漏的,可以添加。
  • 您使用的是哪个 dbms?
  • 你真的读过堆栈跟踪吗?您正在使用hibernate并且没有告诉hibernate方言是什么......因此它尝试使用连接,但显然它无法连接。您尝试使用属性,但要这样做,您需要添加 PropertyPlaceholderConfigurer 或使用 &lt;context:property-placeholder /&gt; 否则您的 ${..} 不会被替换。到底哪里错了,因为你没有发布所有必要的东西,只发布了 sn-ps。
  • @M.Deinum 我已经有了它,并且替换工作正常..以及我手动将值与其相应的属性持有者一起放置。仍然面临同样的问题。
  • 确保您的用户名/密码确实正确并且您的 URL 正确。还有什么是你不需要的 URL 中的所有斜杠...旁边你的 URL 似乎是错误的,afaik 你使用的是普通的 sql server 东西而不是 jdts 的东西,所以我希望 jdbc:sqlserver 开始为 url 而不是你现在拥有的。

标签: java spring jdbc datasource


【解决方案1】:

在您的属性中,您有以下 2 个属性

database.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
database.url=jdbc\:jtds\:sqlserver\://DB_ip:DB_Port/MyDB;instance=Some_Ins;integratedSecurity=true

看起来您使用的是普通的 sql 服务器驱动程序而不是 jTDS 驱动程序,所以我至少希望 URL 没有 :jtds 部分。网址中似乎还有不必要的斜杠。将database.url 更改为以下内容

database.url=jdbc:sqlserver://DB_ip:DB_Port/MyDB;instance=Some_Ins;integratedSecurity=true

这应该是普通 SQL Server 驱动程序的正确 URL。

【讨论】:

    【解决方案2】:

    当我的应用程序无法连接到数据库时,我会遇到同样的异常。所以即使 URL 错误,或者数据库名错误,或者用户/密码组合无效 - 都会抛出同样的异常。

    所以我猜你应该验证连接属性 - 但要小心设置一切正确 - 从数据库服务器 url、端口、数据库名称、用户/密码开始。

    【讨论】:

    • URL 正确,已验证并尝试了 windows 身份验证和 uname 和密码(两种情况下的错误相同)。
    • 我错过了一些东西 - 我收到的异常是“当 'hibernate.dialect' 未设置时,对 DialectResolutionInfo 的访问不能为空”。我正在使用休眠 4.3.11。但我在休眠源代码中找到了引发异常的确切位置——你也可以这样做。找到抛出异常的地方,在那个区域做一些调试,也许你会发现问题所在。这就是我喜欢使用 Hibernate + Spring 的原因,因为它们是开源的,我可以在没有其他方法的情况下调试框架代码。
    • 另外,也许您的堆栈跟踪更长,并且您只放置了顶级异常 + 首先由 - 我认为您错过了最后一个“由”(应该是 org.hibernate.HibernateException 的实例)
    猜你喜欢
    • 2012-06-28
    • 2014-06-29
    • 2019-06-22
    • 2014-12-20
    • 2014-06-21
    • 2021-01-19
    相关资源
    最近更新 更多