无法从SessionFactory获取getCurrentSession(),获取HibernateException

时间:2017-09-14 13:34:19

标签: spring hibernate

它是我的第一个非常简单的Spring-Hibernate应用程序。

我得到了这个 '无法获取当前线程的事务同步会话'错误
 当我试图从SessionFactory获取当前会话时。

我尝试了以下事情..

  1. 在我的道歉中使用了@ Repository,@ Transaction。
  2. 配置了TransactionManager。
  3. 在我的实体类上使用了@ Entity。
  4. 我的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>
    

    我的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>
    

    我的Dao课

             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);
    
            }
       }
    

    最后我的实体类

          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..
    

    提前致谢,对不起我的英语&amp;问题的表示。

1 个答案:

答案 0 :(得分:1)

问题是您的Hibernate和事务配置位于ContextLoaderListener加载的配置文件中。由于该文件中的DispatcherServlet,您的组件由<component-scan />加载。

当使用交易这些通过AOP应用的东西时。 AOP通过后处理bean应用。后处理仅适用于相同上下文中的bean,否则您可能会得到奇怪的结果。

由于你没有2个上下文,AOP的内容与你想要应用AOP的实际组件不同。

您可以将所有内容放在单个上下文中,也可以将<context:component-scan />移动到包含事务配置的配置中。

注意:如果配置文件中有相同的<component-scan />,则所有组件都将加载两次,并且最近使用组件(在本例中为控制器)你有同样的问题。