Как избежать ошибки «Не удалось определить диалект гибернации для имени базы данных [H2]!»?

Я получаю эту ошибку при запуске grails run-app:

Ошибка при выполнении начальной загрузки: Ошибка при создании bean-компонента с именем 'messageSource': инициализация bean-компонента завершилась неудачно; вложенное исключение - org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем «transactionManager»: не удается разрешить ссылку на bean-компонент «sessionFactory» при установке свойства bean-компонента «sessionFactory»; вложенное исключение - org.springframework.beans.factory.BeanCreationException: Ошибка создания bean-компонента с именем 'sessionFactory': не удается разрешить ссылку на bean-компонент 'hibernateProperties' при установке свойства bean-компонента 'hibernateProperties'; вложенное исключение - org.springframework.beans.factory.BeanCreationException: Ошибка создания bean-компонента с именем 'hibernateProperties': не удается разрешить ссылку на bean-компонент 'dialectDetector' при установке свойства bean-компонента с помощью ключа [hibernate.dialect]; вложенное исключение - org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем 'dialectDetector': не удалось вызвать метод инициализации; вложенное исключение - org.codehaus.groovy.grails.orm.hibernate.exceptions.CouldNotDetermineHibernateDialectException: не удалось определить диалект гибернации для имени базы данных [H2]!

Согласно 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), возникает следующая ошибка:

Ошибка при выполнении начальной загрузки: Ошибка при создании bean-компонента с именем 'messageSource': инициализация bean-компонента завершилась неудачно; вложенное исключение - org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем «transactionManager»: не удается разрешить ссылку на bean-компонент «sessionFactory» при установке свойства bean-компонента «sessionFactory»; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем 'sessionFactory': вызов метода инициализации завершился неудачно; вложенное исключение - java.lang.IncompatibleClassChangeError: найден класс org.hibernate.cfg.Mappings, но ожидался интерфейс

Кто-нибудь знает, как с этим справиться?

(Отчет об ошибке существует как http://jira.grails.org/browse/GRAILS-7994)


person user569825    schedule 07.09.2011    source источник


Ответы (5)


Это была ошибка в плагине Joda Time. Подробнее см. В упомянутой проблеме JIRA.

person user569825    schedule 06.01.2012


Я только что обновился до Grails 2.0 и столкнулся с той же проблемой, но если бы я создал новый проект Grails 2.0, таких проблем не было бы. Я оставляю этот ответ для всех, кто может испытать то же самое. Важно убедиться, что используются правильные библиотеки гибернации.

Если вы, как и я, обновляли существующий проект, я рекомендую сравнить файлы конфигурации вашего существующего проекта с файлами конфигурации нового проекта 2.0. Сделав это, вы увидите, что файл конфигурации сборки должен включать плагин гибернации:

runtime ":hibernate:$grailsVersion"
person 34m0    schedule 21.12.2011

Какую версию Grails вы используете? Я считаю, что вы используете Grails 1.3.7.

В H2Dialet есть несколько ошибок из Hibernate.jar, 3.3.1 в Grails 1.3.7, он включен в Hibernate 3.5 и Grails 2.0.

Мое решение: в вашем DataSource.groovy используйте это

dialect='org.hibernate.dialect.H2DialectPatch'

и загрузите класс Java отсюда: Исходный код, измените его имя класса на H2DialectPatch, чтобы избежать сбивает с толку, поместите его в папку src / java.

person James Zhang    schedule 08.09.2011
comment
Я использую 2.0.0.BUILD-SNAPSHOT. Я не уверен, но я думаю, что проблема была и в 2.0.0.M1 (по крайней мере, какая-то ошибка, связанная с H2), но она каким-то образом «исчезла» и теперь снова вернулась. Согласно Jira, которую вы тоже связали, я полагаю, патч уже находится в текущей версии? - person user569825; 08.09.2011
comment
Я еще не пробовал Grails 2.0, поэтому я действительно не знаю, включен ли патч или нет. Я использую этот подход в своих 3 рабочих приложениях с Grails 1.3.7 и базой данных H2, все работают нормально. - person James Zhang; 08.09.2011
comment
Найдите что-нибудь в Google, не уверен, что это поможет или нет. ricardo.strangevistas.net/tag/h2 - person James Zhang; 08.09.2011
comment
Спасибо за подсказку Netwiser. Я пробовал объявление в hibernate/hibernate-dialects.properties, но оно похоже на dialect = org.hibernate.dialect.H2Dialect в DataSource.groovy. По крайней мере, это дает ту же ошибку. - person user569825; 14.09.2011

Похоже, проблема связана с версией JDK 7 (openjdk 7u25).

Альтернативой является использование Ubuntu PPA для Oracle JDK: https://launchpad.net/~webupd8team/+archive/java

который отлично сработал для меня и решил проблему.

person Jacob    schedule 25.11.2013