如何避免“无法确定数据库名称 [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 方言!”?的主要内容,如果未能解决你的问题,请参考以下文章