Potential hibernate version issue: java.lang.NoSuchMethodError: org.hibernate.cfg.Configuration.setListener(Ljava/lang/String;Ljava/lang/Object;)

Potential hibernate version issue: java.lang.NoSuchMethodError: org.hibernate.cfg.Configuration.setListener(Ljava/lang/String;Ljava/lang/Object;)

我正在尝试使用 Intellij 调试 Grails 项目(来自另一个开发人员),运行遇到此错误:

ERROR org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener  - Error initializing
the application: Error creating bean with name 'transactionManagerPostProcessor': Initialization
of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'transactionManager': Cannot resolve reference to bean
'sessionFactory' while setting bean property 'sessionFactory'; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'sessionFactory': Invocation of init method failed; nested exception is
java.lang.NoSuchMethodError:
org.hibernate.cfg.Configuration.setListener(Ljava/lang/String;Ljava/lang/Object;)V
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'transactionManagerPostProcessor': Initialization of bean failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean
property 'sessionFactory'; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'sessionFactory': Invocation of init method failed; nested exception is
java.lang.NoSuchMethodError:
org.hibernate.cfg.Configuration.setListener(Ljava/lang/String;Ljava/lang/Object;)V

通过研究论坛,我怀疑加载程序指的是存在于 Hibernate-3 而不是 Hibernate-4 中的 class。我正在使用 IntelliJ 的 Hibernate 插件,但我看不出为什么要加载 Hibernate-4。

但是,当我创建虚拟 Grails 应用程序时,我没有 运行 出现此错误。

有什么想法吗?

您需要 运行 grails dependency-report 。它将生成如下依赖关系报告。

+--- org.grails.plugins:hibernate:3.6.10.18
|    \--- org.hibernate:hibernate-ehcache:3.6.10.Final
|    \--- org.grails:grails-datastore-core:3.1.3.RELEASE
|         \--- org.javassist:javassist:3.17.1-GA
|         \--- javax.transaction:jta:1.1
|    \--- org.grails:grails-datastore-gorm:3.1.3.RELEASE
|    \--- org.grails:grails-datastore-gorm-hibernate:3.1.3.RELEASE
|         \--- org.grails:grails-datastore-gorm-hibernate-core:3.1.3.RELEASE
|              \--- org.grails:grails-datastore-gorm-plugin-support:3.1.3.RELEASE
|              \--- org.springframework:spring-orm:4.0.7.RELEASE
|    \--- org.grails:grails-datastore-simple:3.1.3.RELEASE
|    \--- commons-collections:commons-collections:3.2.1
|    \--- org.hibernate:hibernate-core:3.6.10.Final
|    \--- javax.validation:validation-api:1.0.0.GA
|    \--- org.hibernate:hibernate-validator:4.1.0.Final
|    \--- org.hibernate:hibernate-entitymanager:3.6.10.Final
|    \--- org.hibernate:hibernate-commons-annotations:3.2.0.Final
+--- org.grails.plugins:database-migration:1.4.0
|    \--- org.liquibase:liquibase-core:2.0.5
+--- org.apache.httpcomponents:httpclient:4.2.3
|    \--- org.apache.httpcomponents:httpcore:4.2.2
|    \--- commons-codec:commons-codec:1.6
+--- org.apache.httpcomponents:httpmime:4.2.3

这将列出您的项目正在使用的所有依赖项。搜索 hibernate4 并查看是否有任何插件引用了 hibernate4。删除或升级插件以使用 hibernate3。

原来我应该通过 Intellij 的项目结构对话框手动指定 Hibernate 的版本(在 Mac 上是通过文件 -> 项目结构)。单击 Dependencies,您将看到如下内容:

如果您 double-click 使用 Hibernate,您会看到如下内容:

在那里,单击 更改版本 并指定所需的库版本。

请注意,更改还要求我删除 libtarget 文件夹,然后重新运行 IntelliJ 才能生效。