如何避免“无法确定数据库名称[H2]的Hibernate方言!”?

时间:2011-09-07 15:03:35

标签: database hibernate grails persistence h2

运行grails run-app时出现此错误:

  

执行bootstraps时出错:使用name创建bean时出错   'messageSource':bean的初始化失败;嵌套异常是   org.springframework.beans.factory.BeanCreationException:错误   创建名为'transactionManager'的bean:无法解析引用   设置bean属性'sessionFactory'时bean'sessionFactory';   嵌套异常是   org.springframework.beans.factory.BeanCreationException:错误   创建名为'sessionFactory'的bean:无法解析对它的引用   设置bean属性时bean'hibernateProperties'   'hibernateProperties';嵌套异常是   org.springframework.beans.factory.BeanCreationException:错误   创建名为'hibernateProperties'的bean:无法解析   设置bean属性时引用bean'dialectDetector'   带有键[hibernate.dialect]的'properties';嵌套异常是   org.springframework.beans.factory.BeanCreationException:错误   创建名为'dialectDetector'的bean:调用init方法   失败;嵌套异常是   org.codehaus.groovy.grails.orm.hibernate.exceptions.CouldNotDetermineHibernateDialectException:   无法确定数据库名称[H2]的Hibernate方言!

相应的 DataSource.groovy

dataSource {
  pooled = true
  driverClassName = "org.h2.Driver"
  username = "sa"
  password = ""
  // Adding this causes a different error:
  // dialect = org.hibernate.dialect.H2Dialect
}

hibernate {
  cache.use_second_level_cache = true
  cache.use_query_cache = true
  cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'
}

environments {
  development {
    dataSource {
      dbCreate = "create-drop" // one of 'create', 'create-drop','update'
      url = "jdbc:h2:mem:devDB"
    }
  }
  test { // test-related stuff }
  production { // prod-related stuff }
}

当我明确提供上述方言org.hibernate.dialect.H2Dialect)时,会出现此错误:

执行bootstraps时出错:创建名为'messageSource'的bean时出错:bean的初始化失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'transactionManager'的bean时出错:在设置bean属性'sessionFactory'时无法解析对bean'sessionFactory'的引用;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'sessionFactory'的bean时出错:init方法的调用失败;嵌套异常是java.lang.IncompatibleClassChangeError:找到类org.hibernate.cfg.Mappings,但是接口是预期的

任何人都知道如何应对这种情况?

(错误报告存在为http://jira.grails.org/browse/GRAILS-7994

5 个答案:

答案 0 :(得分:3)

这是Joda Time Plugin中的一个错误。有关详细信息,请参阅上述JIRA issue

答案 1 :(得分:2)

如果jdk是Java 7u25和grails 2.2.1,可能是解决方案:: Grails suddenly throws error Could not determine Hibernate dialect for database name

错误在grails 2.2.3中修复的信息是正确的。我测试了它,它工作。要点是(Spring loaded causes Grails to fail to bootstrap using Oracle JDK 1.7u25):

我希望你觉得它很有用:)

答案 2 :(得分:1)

我刚刚升级到Grails 2.0,并遇到了同样的问题,但如果我创建了一个全新的Grails 2.0项目,则没有这样的问题。我把这个答案留给任何可能会遇到同样问题的人。确保正确使用正确的hibernate库非常重要。

如果像我一样升级现有项目,我建议将现有项目的配置文件与全新2.0项目的配置文件进行比较。执行此操作,您将看到构建配置文件应包含一个hibernate插件:

runtime ":hibernate:$grailsVersion"

答案 3 :(得分:0)

您使用的是哪个版本的Grails?我相信你使用的是Grails 1.3.7。

H2Dialet有一些来自Hibernate.jar的错误,在Grails 1.3.7中是3.3.1,它包含在Hibernate 3.5和Grails 2.0中。

我的解决方案是,在您的DataSource.groovy中,使用此

dialect='org.hibernate.dialect.H2DialectPatch'

从这里下载Java类:Source Code,将其类名更改为H2DialectPatch以避免混淆,将其放在src / java文件夹中。

答案 4 :(得分:0)

似乎问题与JDK 7的版本有关(openjdk 7u25)。

替代方案是使用Ubuntu PPA for Oracle JDK: https://launchpad.net/~webupd8team/+archive/java

对我来说很好,并解决了这个问题。