вложенным исключением является java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;]

Я использую Spring 4.x и Hibernate 4.x для разработки простой операции CURD на основе отдыха. Я получаю исключение ниже всякий раз, когда я вызываю URL-адрес для получения всех пользователей в базе данных.

    for servlet [helloApp] in context with path [/helloApp] threw exception [Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; 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.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:496)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:420)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:257)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy27.getAllPerson(Unknown Source)
    at com.controller.PersonController.getAllPerson(PersonController.java:30)
    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:214)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:748)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:822)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Ниже приведена конфигурация для helloApp-servlet.xml.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

   <mvc:annotation-driven/> 
   <context:annotation-config/>
   <context:component-scan base-package="com"/>
   <import resource="db-config.xml" />   

   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/" />
      <property name="suffix" value=".jsp" />
   </bean>  
</beans>

Ниже приведен код для db-config.xml.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
    <bean id="dbPropertyConfigurer"
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>/WEB-INF/db_config.properties</value>
            </list>
        </property>
    </bean>
    <!-- Database Properties -->
    <bean id="dataSource"
        class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"
                p:driverClass="${jdbc.driver.className}"
                p:jdbcUrl="${jdbc.url}"
                p:user="${jdbc.username}"
                p:password="${jdbc.password}"               
                />
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
            <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hbm2ddl.auto">update</prop>
            </props>
        </property>
        <property name="packagesToScan" value="com.entity" />
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />
</beans>

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

Пожалуйста, найдите ниже контроллер-

package com.controller;

import java.util.List;
import java.util.Date;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;


import com.dao.PersonDAO;
import com.entity.Person;

@RestController
public class PersonController {
    private static Logger logger = Logger.getLogger(PersonController.class);

    @Autowired PersonDAO personDAO;


     @RequestMapping(value="/person/all",method = RequestMethod.GET,headers="Accept=application/json")
     public List<Person> getAllPerson(){
         List<Person> persons=personDAO.getAllPerson();
         logger.info("## Returninf the persons !!!"+persons);
         return persons;
     }

     @RequestMapping(value="/person/{personId}",method = RequestMethod.GET,headers="Accept=application/json")
     public Person getOnePerson(@PathVariable int personId){
         Person person=personDAO.getPerson(personId);
         logger.info("## Returning the person with personId..."+personId);
         return person;
     }


     @RequestMapping(value="/person/create",method = RequestMethod.POST,headers="Accept=application/json")
     public List<Person> createNewPerson(@RequestBody Person person){
         Person persons=null;
         persons.setName(person.getName());
         persons.setLast_accessed(new Date());
         logger.error("## Inside person creation controller !!!!!!");

         try{
             personDAO.createPerson(persons);
             logger.info("####### Creating persons !!!!!");
         }catch(Exception e){
             logger.error("$$$ Exception occured in creating person!!!!");
             e.printStackTrace();
         }
         return getAllPerson();
     }

     @RequestMapping(value="/person/delete/{personId}",method = RequestMethod.POST,headers="Accept=application/json")
     public List<Person> deletePerson(@PathVariable int personId){
            personDAO.deletePerson(personId);   
            logger.info("## Successfully deleted the person with personId "+personId);
         return getAllPerson();
     }

     @RequestMapping(value="/person/update",method = RequestMethod.POST,headers="Accept=application/json")
     public List<Person> updatePerson(@RequestBody Person person){
         Person persons=personDAO.getPerson(person.getId());
         persons.setName(person.getName());
         persons.setLast_accessed(new Date());
         try{
             personDAO.updatePerson(persons);
             logger.info("Updating person !!!!!");
         }catch(Exception e){
            logger.error("Error in updating person !!!!!!");
             e.printStackTrace();
         }
         return getAllPerson();
     }
}

Класс DAO, имеющий объект фабрики сеансов -

package com.dao;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.apache.log4j.Logger;
import com.entity.Person;

@Component
@Transactional(readOnly=true)
public class PersonDAOImpl implements PersonDAO {
    private static Logger logger = Logger.getLogger(PersonDAOImpl.class);

    @Autowired
    private SessionFactory sessionFactory;
    Session session = null;

    private void assignSessionLocalVariable(){
        if(session == null || !session.isOpen()){
            try{                
                session = sessionFactory.openSession();
            }catch(Exception e){session = null;
                logger.error("/### Session is null ####/");
            }
        }
    }


    @Override
    public List<Person> getAllPerson() {
        List<Person> persons=null;
        assignSessionLocalVariable();
        if(session!=null){
            try{    
                    String q="from person ";
                    Query query = session.createQuery(q);
                    persons = query.list(); 
            }catch(Exception e){

                logger.error("########### Exception occured while fetching all persons in IMPL ########## ["+e+"]\n ");
            }
        }   
        return persons;
    }

    @Override
    public Person getPerson(int personId) {
        assignSessionLocalVariable();
        Person person= (Person) session.load(Person.class, personId);
        session.close();
        return person;
    }

    @Override
    public void createPerson(Person person) {
        assignSessionLocalVariable();
        try{
            Transaction tx=session.beginTransaction();
            session.save(person);
            tx.commit();
        }catch(Exception e){
            e.printStackTrace();
        }
        session.close();
    }

    @Override
    public void deletePerson(int personId) {
        assignSessionLocalVariable();
        Person person= (Person) session.load(Person.class, personId);
        try{
            session.delete(person);
        }catch(Exception e){
            e.printStackTrace();
        }
        session.close();

    }

    @Override
    public void updatePerson(Person person) {
        assignSessionLocalVariable();
        try{
                Transaction tx=session.beginTransaction();
                session.update(person);
                tx.commit();
        }catch(Exception e){
                logger.error("### Exception occured while updating PERSON #### in IMLP ["+e+"] \n");
        }
        session.close();

    }

}

person Harshit    schedule 17.12.2015    source источник
comment
Покажите код, а не только ошибки com.controller.PersonController.getAllPerson(PersonController.java)   -  person Mihir    schedule 17.12.2015
comment
Как вы создаете свой объект sessionFactory в DAO или в отдельном классе Util, также опубликуйте этот класс.   -  person Mihir    schedule 17.12.2015
comment
Какую версию спящего режима и весны вы используете?   -  person Mihir    schedule 17.12.2015
comment
Версия 4.x весны и спящего режима.   -  person Harshit    schedule 17.12.2015
comment
Нет, тогда как в трассировке стека ошибок он отображается как org.springframework.orm.hibernate3.HibernateTransactionManager.....   -  person Mihir    schedule 17.12.2015
comment
Вы используете не тот менеджер транзакций. Кроме того, ваше Дао ошибочно, очень ошибочно. Никогда не сохраняйте сеанс как локальную переменную. Кроме того, при использовании поддержки транзакций Spring вместо этого используйте openSession use getCurrentSession .   -  person M. Deinum    schedule 17.12.2015
comment
@ M.Deinum, не могли бы вы уточнить свой ответ. Будем благодарны узнать.   -  person Harshit    schedule 17.12.2015
comment
Вы сохраняете сеанс в локальной переменной. Теперь представьте, что 10 потоков запрашивают данные... Какая у вас сессия? Одно переписывает другое. При использовании openSession вместо getCurrentSession вы в основном обходите транзакцию Springs и управление ресурсами.   -  person M. Deinum    schedule 17.12.2015
comment
@М. Deinum, можешь объяснить на каком-нибудь примере.   -  person Harshit    schedule 17.12.2015


Ответы (1)


<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

Ваша конфигурация TransactionManager неверна, настройте bean-компонент диспетчера транзакций Hibernate4 вместо Hibernate3. и Убедитесь, что ваши зависимости верны.

person Lovababu    schedule 17.12.2015