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

Posted

技术标签:

【中文标题】如何避免“无法确定数据库名称 [H2] 的 Hibernate 方言!”?【英文标题】:How do I avoid 'Could not determine Hibernate dialect for database name [H2]!'? 【发布时间】: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 存在)

【问题讨论】:

【参考方案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

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

【讨论】:

以上是关于如何避免“无法确定数据库名称 [H2] 的 Hibernate 方言!”?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免重复的工作?

DDoS攻击是啥?应该如何避免?

Mongodb 连接失败,怎么避免抛错影响正常流程

Java中,当的数据过大时,如何避免值的改变?

如何避免嵌套订阅超过两个级别

如何触发(不避免!) HttpClient 死锁