Database 我如何避免';无法确定数据库名称[H2]的Hibernate方言';?

Database 我如何避免';无法确定数据库名称[H2]的Hibernate方言';?,database,hibernate,grails,persistence,h2,Database,Hibernate,Grails,Persistence,H2,运行grails run app时出现此错误: 执行引导时出错:创建名为的bean时出错 “messageSource”:bean初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 正在创建名为“transactionManager”的bean:无法解析引用 设置bean属性“sessionFactory”时调用bean“sessionFactory”; 嵌套异常是 org.springframework.

运行
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属性时bean“hibernateProperties” “hibernateProperties”;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 正在创建名为“hibernateProperties”的bean:无法解析 设置bean属性时对bean“方言检测器”的引用 带有键[hibernate.dial]的“属性”;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“方言检测器”的bean:init方法的调用 失败;嵌套异常是 org.codehaus.groovy.grails.orm.hibernate.exceptions.CouldNotDetermineHibernateDialectException: 无法确定数据库名称[H2]的Hibernate方言

相应的数据源.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.dialogue.h2dialogue
),则会发生以下错误:

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

有人知道如何应对吗?


(错误报告的存在形式为)

您使用的是哪个版本的Grails?我相信您正在使用Grails1.3.7

H2Dialet有一些来自Hibernate.jar的bug,Hibernate.jar在grails1.3.7中是3.3.1,它包含在hibernate3.5和grails2.0中

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

dialect='org.hibernate.dialect.H2DialectPatch'

然后从这里下载Java类:,将其类名更改为H2方言补丁以避免混淆,将其放在您的src/Java文件夹中。

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

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

runtime ":hibernate:$grailsVersion"

这是Joda Time插件中的一个bug。有关详细信息,请参见前面提到的。

如果jdk是Java 7u25和grails 2.2.1,可能是一种解决方案:

Grails2.2.3中修复的错误信息是正确的。我测试了它,它成功了。需要指出的一点是():


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

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

另一种选择是将Ubuntu PPA用于Oracle JDK:


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

我使用的是2.0.0.BUILD-SNAPSHOT。我不确定,但我认为问题也出现在2.0.0.M1中(至少是一些与H2相关的错误),但它不知何故“消失”了,现在又回来了。根据你链接的Jira,我想该补丁已经在当前版本中了?我还没有试用Grails2.0,所以我真的不知道该补丁是否包含在内。我在Grails1.3.7和H2数据库的3个生产应用程序中使用了这种方法,所有这些都运行良好。从Google中查找一些东西,不确定是否有用。谢谢你的提示。我在
hibernate/hibernate dialogs.properties
中尝试了该声明,但它似乎与DataSource.groovy中的
dialogue=org.hibernate.dialogue.h2dialogue
相同。至少它会产生同样的错误,这个错误似乎在Grails2.2.4中再次出现