本帖最后由 sunshine_love 于 2013-11-19 16:39:48 编辑

解决方案 »

  1.   

    http://www.cnblogs.com/Oloven/错误3:nested exception is org.hibernate.HibernateException: No Session found for current thread原因:发现一些bean无法获得当前session,需要把之前一些方法的事务从NOT_SUPPORT提升到required,readonly=true见https://jira.springsource.org/browse/SPR-9020, http://www.iteye.com/topic/1120924解决: <tx:advice id="baseServiceAdvice" transaction-manager="transactionManager">   <tx:attributes>      <tx:method name="get*" read-only="true" propagation="REQUIRED"/><!--之前是NOT_SUPPORT-->      <tx:method name="find*" read-only="true" propagation="REQUIRED"/><!--之前是NOT_SUPPORT-->      <tx:method name="save*" propagation="REQUIRED"/>      <tx:method name="update*" propagation="REQUIRED"/>      <tx:method name="remove*" propagation="REQUIRED"/>      <tx:method name="add*" propagation="REQUIRED"/>      <!--默认其他方法都是REQUIRED-->      <tx:method name="*"/>   </tx:attributes></tx:advice>
      

  2.   


    不是 是项目启动运行的,那个main是我随意加的
      

  3.   

    这个属于spring 的初始化顺序问题。
    init-method是在每个bean建立时就会被调用,但是这个时间不能保证session factory等类被初始化(可能建立,但是没有配置属性进行初始化)
    因此,基本上init-method是没有成功的可能的(多级ApplicationContext,则因为每级会独立完成初始化,属于另一种情况)一般来讲,依赖别的类初始化完成后执行的代码  是通过 实现 InitialzingBean接口
    afterPropertiesSet方法来执行的。
      

  4.   


    嗯,你说的很多,我试下您说的方法;不过,昨晚上研究了下spring的事件传播机制,我上面的需求也可以使用spring提供的五个标准事件之一的容器启动的事件---ContestStartedEvent来实现。
      

  5.   


    sorry 应该是ContextRefreshedEvent这个事件;
    http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/beans.html#context-functionality-events
      

  6.   

    引发这个错误的表现是Hibernate,实际情况由于Spring托管Bean的生命周期引发的
    当你的Bean在创建后,Spring立刻会调用Init用于类的初始化,整个由托管的SpringBean其实并没有完全被初始化完成,类加载顺序的不同会导致系统出现莫名其妙的问题。。解决办法:
    不要使用Init方式初始化,而是监听Spring的上下文事件,接收Refresh事件(全名忘记了),此事件表示Spring完成的上下文的创建,这个时候你所有的bean都加载完成并可以提供工作了,这个时候你可以随意操作数据库了
      

  7.   

    嗯 是的 监听spring的事件可以实现。ContextRefreshedEvent