Ninad Gosavi
Ninad Gosavi

Reputation: 138

Not able to getCurrentSession() from SessionFactory , Getting HibernateException

Its my first very simple Spring-Hibernate application.

i am getting this
'Could not obtain transaction-synchronized Session for current thread ' error
when i am trying to get current session from SessionFactory.

I tried following things..

  1. used @Repository , @Transactional in my dao.
  2. configured TransactionManager.
  3. used @ Entity on my entity class.

my root-context.xml

   <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:tx="http://www.springframework.org/schema/tx"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
              http://www.springframework.org/schema/context                             
                 http://www.springframework.org/schema/context/spring-
                                            context.xsd
                http://www.springframework.org/schema/tx 
                http://www.springframework.org/schema/tx/spring-tx.xsd">

                   <!--     <context:property-placeholder 
                    location="classpath:../properties/db.properties" /> -->

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/hib" />
    <property name="username" value="root" />
    <property name="password" value="" />       
</bean> 

    <bean id="sessionFactory" 
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.nin.entity" />
    <property name="hibernateProperties">
        <props>
        <prop 
         key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.default_schema">hib</prop>
        </props>
    </property>

     <tx:annotation-driven transaction-manager="TransactionManager" />  

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



<bean id="viewResolver"    class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
          <property name="prefix">
             <value>/WEB-INF/view/</value>
           </property>
          <property name="suffix">
             <value>.jsp</value>
          </property>
       </bean>

My dispatcherServlet.xml

   <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:mvc="http://www.springframework.org/schema/mvc"
          xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:context="http://www.springframework.org/schema/context"
          xsi:schemaLocation="http://www.springframework.org/schema/mvc 
          http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
                  http://www.springframework.org/schema/tx 
                  http://www.springframework.org/schema/tx/spring-tx-3.1.xsd     
                  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">

    <context:component-scan base-package="com.nin"></context:component-scan>

    <mvc:annotation-driven/>

    </beans>

My Dao class

         package com.nin.dao;

         import org.hibernate.Session;
         import org.hibernate.SessionFactory;
         import org.springframework.beans.factory.annotation.Autowired;
         import org.springframework.stereotype.Repository;
         import org.springframework.transaction.annotation.Transactional;

         import com.nin.entity.Student;



     @Repository
      public class DaoImpl {    

               @Autowired
               private SessionFactory sf;   

               @Transactional
               public void register (Student st){

           sf.getCurrentSession();   //Getting Error at this line.

        //      Session session = sf.getCurrentSession();
        //      session.save(st);

        }
   }

lastly my entity class

      package com.nin.entity;

        import javax.persistence.Column;
        import javax.persistence.Entity;
        import javax.persistence.Id;
        import javax.persistence.Table;


  @Entity
  @Table(name="student")
  public class Student {


  @Column(name="name")
  private String name;

    @Id
    @Column(name="rollno")
    private String rollno;
    @Column(name="password")
    private String password;
    @Column(name="city")
    private String city;



    public Student(){};
  //and getters and setters..

Thanks in advance and sorry for my English & representation of question.

Upvotes: 0

Views: 1004

Answers (1)

M. Deinum
M. Deinum

Reputation: 124441

The problem is that your Hibernate and transaction configuration is in the configuration file loaded by the ContextLoaderListener. Whereas your components are loaded by the DispatcherServlet due to the <component-scan /> in that file.

When using things like transactions those are applied through AOP. AOP is applied through post processing beans. Post processing only applies to beans in the same context, else you might get strange results.

As you haven't 2 contexts, the AOP stuff is in a different one then the actual components you want to apply AOP to.

You can either put everything in a single context or move the <context:component-scan /> to the configuration containing the transactional configuration.

Note: If you have the same <component-scan /> in the configuration file all of your components will be loaded twice and as the nearest to the component (in this case controller) is being used you have the same problem.

Upvotes: 1

Related Questions