maple_end 2017-11-28 08:56 采纳率: 0%
浏览 723

No Hibernate Session bound to thread

尝试用spring+spring mvc+hibernate搭一个简单的项目,最终数据展示的时候hibernate一直报No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here] with root cause的错误,网上找了好多都是说没有配置

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

但是我是有配置的,非常崩溃,请教下大家。
sessionFactory的配置如下:

    <!-- 配置session工厂 -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="defaultDataSource" />
        </property>
        <property name="mappingLocations">
            <list>
                <value>classpath:/com/recommend/effect/**/model/*.hbm.xml</value>
            </list>
        </property>


        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->

                <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
            </props>
        </property>
    </bean>

事务配置如下:

    <!-- 配置事务管理 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>

     <!-- 开启注解事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <tx:advice transaction-manager="transactionManager" id="defaultTransactionAdvice">
        <tx:attributes>
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />
            <tx:method name="get*" propagation="REQUIRED" read-only="true" />
            <tx:method name="query*" propagation="REQUIRED" read-only="true" />
            <tx:method name="check*" propagation="REQUIRED" read-only="true" />
            <tx:method name="load*" propagation="REQUIRED" read-only="true" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>

aop控制如下:

    <!-- 服务AOP配置 -->
    <aop:config expose-proxy="true">
        <aop:pointcut id="systemTransactionPolicy"
            expression="execution(* org.trustel.service.hibernate.*.*(..))"/>
        <aop:advisor id="systemTransactionAdvisor" advice-ref="defaultTransactionAdvice"
            pointcut-ref="systemTransactionPolicy" />
    </aop:config>
    <aop:config>
        <aop:pointcut id="developFlowTransactionPolicy"
            expression="execution(* com.recommend.*.service..*.*(..))" />
        <aop:advisor id="developFlowTransactionAdvisor"
            advice-ref="defaultTransactionAdvice" pointcut-ref="developFlowTransactionPolicy" />
    </aop:config>

文件数如下:
图片说明

报错也就是获取currentSession

    protected Query createQuery(String hql) {
        Session session = getSessionFactory().getCurrentSession();
        Query query = session.createQuery(hql);
        return query;
    }
  • 写回答

1条回答 默认 最新

  • maple_end 2017-11-28 10:14
    关注

    很崩溃,又捣鼓了一下发现了问题,自己傻逼了。因为一开始忘记配置事物,后面补的时候这里补一点哪里补一点居然忘记了最开始的开放session
    在web.xml中加入hibernate的过滤请求将session打开即可,配置如下。

     <filter>  
        <filter-name>openSessionInViewFilter</filter-name>  
        <filter-class>  
            org.springframework.orm.hibernate3.support.OpenSessionInViewFilter  
        </filter-class>  
    </filter>  
    
    <filter-mapping>  
        <filter-name>openSessionInViewFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
    

    既然除了问题,也就在这里做个总结把。
    getCurrentSession出错检查这几个地方,一是上面这个在web.xml中配置开启session,(当然数据库那些数据源,sessionFactory等该配置的配置,不然哪来的事物)

    二就去检查自己有没有配置事物管理,如我问题中配置那样配置即可。
    三是去检查有没有开启注解事物,没有在spring配置文件中加上这样一条即可

      <!-- 开启注解事务 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
    

    然后检查声明式事物管理的配置,注意其中的name属性看看有没有包含自己事物代码的方法find* 表示以find开头的方法

    不大熟悉可以搜索下tx:advice

         <tx:advice transaction-manager="transactionManager" id="defaultTransactionAdvice">
            <tx:attributes>
                <tx:method name="find*" propagation="REQUIRED" read-only="true" />
                <tx:method name="get*" propagation="REQUIRED" read-only="true" />
                <tx:method name="query*" propagation="REQUIRED" read-only="true" />
                <tx:method name="check*" propagation="REQUIRED" read-only="true" />
                <tx:method name="load*" propagation="REQUIRED" read-only="true" />
                <tx:method name="save*" propagation="REQUIRED" />
                <tx:method name="add*" propagation="REQUIRED" />
                <tx:method name="create*" propagation="REQUIRED" />
                <tx:method name="insert*" propagation="REQUIRED" />
                <tx:method name="update*" propagation="REQUIRED" />
                <tx:method name="*" propagation="REQUIRED" />
            </tx:attributes>
        </tx:advice>
    

    再然后去检查下看看配置的aop控制有没有扫描到自己写了事物逻辑的代码文件。上述总结可能会有错误和不足,发现再纠正。
    最后给自己一个提醒。练习在有系统的知识体系基础下会事半功倍,不然会做很多挺费时间的无用功

    评论

报告相同问题?

悬赏问题

  • ¥15 vue3页面el-table页面数据过多
  • ¥100 vue3中融入gRPC-web
  • ¥15 kali环境运行volatility分析android内存文件,缺profile
  • ¥15 写uniapp时遇到的问题
  • ¥15 vs 2008 安装遇到问题
  • ¥15 matlab有限元法求解梁带有若干弹簧质量系统的固有频率
  • ¥15 找一个网络防御专家,外包的
  • ¥100 能不能让两张不同的图片md5值一样,(有尝)
  • ¥15 informer代码训练自己的数据集,改参数怎么改
  • ¥15 请看一下,学校实验要求,我需要具体代码