java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session

Я пытаюсь интегрировать мой уже работающий весенний проект с 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)

Я прогуглил это, но все, что я мог найти, было то, что подобные проблемы были вызваны дубликатами в classpath, но я посмотрел очень внимательно, и я не думаю, что они являются дубликатами в моем classpath. (может быть, я ошибаюсь.) Вот снимок экрана банок в моем классевведите описание изображения здесь

я застрял, любая помощь будет принята с благодарностью

РЕДАКТИРОВАТЬ: Поиск org.hibernate.SessionFactory дает

введите описание изображения здесь

2 ответа

Решение

Проблема в том, что у вас есть hibernate-core-4.0.0.Final.jar в вашем classpath, но Spring 3.1 использует hibernate-core-3.6.0.Final.jar (см. здесь Spring 3.1 артефакт и зависимости).

Удалите Hibernate 4.0 и вместо этого поместите Hibernate 3.6 в ваш путь к классам.

Кстати, там может быть еще несколько таких мисс матчей. Лучше использовать Maven, чтобы заботиться о зависимостях.

РЕДАКТИРОВАТЬ - еще некоторые детали

В Hibernate 3.6 интерфейс Session был в упаковке org.hibernate.classic тогда как в Hibernate 4.0 он был перенесен в пакет org.hibernate ,

В спящем 3.6 SessionFactory.openSession больше не возвращает org.hibernate.classic.Session скорее он возвращает org.hibernate.Session, Это рефакторинг, который нарушает код клиента...

Если вы используете Eclipse в качестве IDE и maven в качестве инструмента сборки, попробуйте проверить записи пути сборки. Иногда старые JAR добавляются как записи пути к классам, которые не отменяются maven clean или update.

Вам необходимо удалить эти записи.

См. Изображение ниже

Вышеуказанные записи не должны присутствовать в пути сборки, поскольку они не отменяются maven clean.

У меня были подобные проблемы; использовал другую версию 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 

Эта ошибка вызвана транзитивной зависимостью проектов, управляемых maven. Ребенок будет использовать определенную версию артефакта, но родитель получит более позднюю версию. В моем случае мне пришлось использовать

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

В родительском pom (т.е. я снова указал версию зависимости в родительском pom), чтобы избежать этого конфликта.

Другие вопросы по тегам