【问题标题】:How do I avoid 'Could not determine Hibernate dialect for database name [H2]!'?如何避免“无法确定数据库名称 [H2] 的 Hibernate 方言!”?
【发布时间】:2011-11-12 06:15:54
【问题描述】:

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

执行引导程序时出错:使用名称创建 bean 时出错 'messageSource': bean 初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“transactionManager”的bean:无法解析引用 在设置 bean 属性 'sessionFactory' 时 bean 'sessionFactory'; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“sessionFactory”的bean:无法解析对 bean 'hibernateProperties' 同时设置 bean 属性 '休眠属性';嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“hibernateProperties”的bean:无法解析 在设置 bean 属性时引用 bean 'dialectDetector' 带有键 [hibernate.dialect] 的“属性”;嵌套异常是 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),则会出现此错误:

执行引导程序时出错:创建名为“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: Found class org.hibernate.cfg.Mappings, but interface is expected

有人知道如何应对吗?

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

【问题讨论】:

    标签: database hibernate grails persistence h2


    【解决方案1】:

    您使用的是哪个版本的 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 文件夹中。

    【讨论】:

    • 我正在使用 2.0.0.BUILD-SNAPSHOT。我不确定,但我认为问题也存在于 2.0.0.M1 中(至少是一些与 H2 相关的错误),但它以某种方式“消失”,现在又回来了。根据你链接的 Jira,我想补丁已经在当前版本中了?
    • 我还没有试用 Grails 2.0,所以我真的不知道补丁是否包含在内。我在我的 3 个带有 Grails 1.3.7 和 H2 数据库的生产应用程序中使用了这种方法,一切正常。
    • 从谷歌上找东西,不确定它是否有帮助。 ricardo.strangevistas.net/tag/h2
    • 感谢 Netwiser 的提示。我在hibernate/hibernate-dialects.properties 中尝试了声明,但这似乎与DataSource.groovy 中的dialect = org.hibernate.dialect.H2Dialect 相同。至少它会产生相同的错误。
    【解决方案2】:

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

    如果您像我一样升级现有项目,我建议您将现有项目的配置文件与全新的 2.0 项目的配置文件进行比较。这样做你会看到构建配置文件应该包含一个休眠插件:

    runtime ":hibernate:$grailsVersion"
    

    【讨论】:

      【解决方案3】:

      这是 Joda Time 插件中的一个错误。有关详细信息,请参阅提到的JIRA issue

      【讨论】:

        【解决方案4】:

        如果 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):

        我希望你觉得它有用:)

        【讨论】:

        • Grails 2.2.4 中似乎又出现了这个错误
        【解决方案5】:

        看来问题与JDK 7(openjdk 7u25)的版本有关。

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

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

        【讨论】:

          猜你喜欢
          • 2017-01-31
          • 2013-06-22
          • 1970-01-01
          • 2019-03-04
          • 1970-01-01
          • 1970-01-01
          • 2021-12-09
          • 2018-05-01
          • 1970-01-01
          相关资源
          最近更新 更多