【问题标题】:java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Sessionjava.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session
【发布时间】:2012-02-06 14:52:05
【问题描述】:

我正在尝试将我已经在工作的 spring 项目与 hibernate 集成,但这是我在启动时遇到的错误。

EVERE: Servlet.service() for servlet [appServlet] in context with path [/TelephoneDirectory] threw exception [Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;] with root cause
java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;
    at org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:322)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(SessionFactoryUtils.java:233)
    at org.springframework.orm.hibernate3.HibernateTemplate.getSession(HibernateTemplate.java:457)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:393)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:904)
    at com.emumba.telephonedirectory.repository.JdbcPersonDao.getPersonsList(JdbcPersonDao.java:36)
    at com.emumba.telephonedirectory.service.SimpleDirectoryManager.getAllPersons(SimpleDirectoryManager.java:23)
    at com.emumba.telephonedirectory.web.HomeController.home(HomeController.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

我用谷歌搜索了它,但我只能找到类似的问题是由类路径中的重复引起的,但我仔细观察过,我认为它们在我的类路径中没有任何重复。 (可能是我错了。)这是我的类路径中 jar 的屏幕截图

我被卡住了,任何帮助将不胜感激

编辑:搜索 org.hibernate.SessionFactory 给出

【问题讨论】:

  • 如果使用ctrl-shift-t 搜索org.hibernate.SessionFactory 会得到多少结果?
  • 你在使用 maven - 然后尝试 dependency:tree 来获取你的依赖关系的树形结构。您还可以在“.classpath”文件中搜索重复项。
  • @James 我正在编辑问题以添加用于搜索 org.hibernate.SessionFactory 的屏幕截图

标签: java hibernate spring


【解决方案1】:

如果您使用 Eclipse 作为 IDE 并使用 maven 作为构建工具,请尝试检查构建路径条目。有时,旧的 JAR 会被添加为不会被 maven clean 或 update 覆盖的类路径条目。

您需要删除这些条目。

参考下图

以上条目不应出现在构建路径中,因为它们不会被 maven clean 覆盖。

【讨论】:

    【解决方案2】:

    此错误是由 maven 托管项目的传递依赖引起的。子级将使用特定版本的人工制品,但父级将获取更高版本。就我而言,我不得不使用

    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.11.Final</version>
        </dependency>
    </dependencies>
    

    在父pom中(即我已经在父pom中再次指定了依赖版本)以避免这种冲突。

    【讨论】:

      【解决方案3】:

      我遇到了类似的麻烦;使用不同版本的 apache-camel-extra 帮助解决了问题

      compile group: 'org.apache-extras.camel-extra', name: 'camel-hibernate', version: '2.18.0'
      

      我们的应用设置

      gradle
      apache-camel
      spring
      hibernate
      spring-jta and atomikos 
      

      【讨论】:

        【解决方案4】:

        问题是您的类路径中有hibernate-core-4.0.0.Final.jar,但Spring 3.1 使用hibernate-core-3.6.0.Final.jar(请参阅here Spring 3.1 工件和依赖项)。

        删除 Hibernate 4.0 并将 Hibernate 3.6 放在您的类路径中。

        顺便说一句,可能还有更多这样的错过比赛。最好使用maven来处理依赖关系。

        编辑 - 更多细节

        在 Hibernate 3.6 中,接口 Session 位于包 org.hibernate.classic 中,而在 Hibernate 4.0 中,它被移动到包 org.hibernate

        在 Hibernate 3.6 中,SessionFactory.openSession 不再返回 org.hibernate.classic.Session,而是返回 org.hibernate.Session。这是一个破坏客户端代码的重构......

        【讨论】:

        • 其实hibernate第3版中同时有org.hibernate.classic.Sessionorg.hibernate.Session两个接口
        • @bestsss - 你是对的。这两个接口都存在于 3.6 中。只有 SessionFactory 被更改为返回 org.hibernate.Session 而不是 org.hibernate.classic.Session - 这就是破坏客户端代码的原因。我会修复答案。
        • 有没有办法在不降级 Hibernate 的情况下解决这个问题?
        • @Dojo 升级 Spring...(和 Hibernate,而你正在使用它 :-))
        • "最好使用maven来处理依赖关系。"您仍然需要指定版本,不是吗?
        猜你喜欢
        • 2015-08-03
        • 2016-03-23
        • 1970-01-01
        • 1970-01-01
        • 2018-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-01
        相关资源
        最近更新 更多