当前位置: 首页 > 知识库问答 >
问题:

未找到当前线程Spring 3.1的会话

韶硕
2023-03-14

我试图在一个演示的独立应用程序中使用Spring,使用DAO层和服务层来使用委托的Hibernate事务。

我已经正确地设置了配置,并且我已经对DAO方法上使用@Transactional注释进行了单元测试,测试结果表明它可以正常工作,但是当我将这个注释移动到服务层时,我得到了一个:

org.hibernate.HibernateException: No Session found for current thread

我提供了代码中最相关的部分,希望您能给我一个提示,让我了解这里发生了什么。

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

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

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

    <!-- sessionFactory config -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>        
        <property name="mappingDirectoryLocations">
            <list>  
                 <value>classpath:com/genericdao/hbm</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.SybaseAnywhereDialect</prop>
                <!--prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop--><!-- i tried commenting this line -->                
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>                    
                <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop><!-- i know this is provided by default -->
            </props>
        </property>
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        ... i provide here configuration
    </bean>                  
</beans>

在GenericDaoHibernateImpl中,会话工厂actory.get自动安装

@Repository("userLoginDao")
public class UserLoginDaoImpl extends GenericDaoHibernateImpl<UserLogin, Integer> implements UserLoginDao{            

    @Override
    //@Transactional(readOnly=true) // This works when i unit-test!! But I don't want to use @Transactional here!!
    public List<UserLogin> findAll() {        
        boolean active = TransactionSynchronizationManager.isActualTransactionActive(); // always true if i use @Transactional

        Query query = getSession().createQuery("from UserLogin");

        return (List<UserLogin>) query.list();
    }                  
}
@Service("pruebaService")
public class PruebaServiceImpl implements PruebaService{

    private static final ApplicationContext ctx;

    static{
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }   

    /**********************************************************
     * HERE i want to use @Transactional, but it doesn't work because
     * i get the org.hibernate.HibernateException: No Session found for current thread
     * when i test invocation of this method...
     * NOTE: I want to state, that if i uncomment the Dao @Transactional line
     * then this works!!, but as i mentioned before i really don't want to have transactions on DAO methods, just Service Methods!!
     */
    @Override
    @Transactional(readOnly=true) 
    public List<UserLogin> obtenerTodasLasCuentas() {
        UserLoginDao bean = (UserLoginDao) ctx.getBean("userLoginDao");
        List<UserLogin> result = bean.findAll();
        return result;
    }
}

我真的在这个话题上做了一个搜索,但我找不到合适的输入。。。希望你能帮上忙。。。谢谢

下面是我正在使用的测试相关代码

@Test
public void selectTest(){
    pruebaService = (PruebaService) ctx.getBean("pruebaService");            
    Assert.assertNotNull(pruebaService); // This assert is good, so i know service is properly injected            
    List<UserLogin> result = pruebaService.obtenerTodasLasCuentas();            
    Assert.assertNotNull(result); // This line is never reached because of the exception i mentioned!!
}

共有1个答案

阚亮
2023-03-14

好的,我完成了这项工作,我只是将服务修改为:

@Service("pruebaService")
public class PruebaServiceImpl implements PruebaService{

    private @Autowired UserLoginDao userLoginDao; // injected by Spring when I create the ApplicationContext in my unit-testing class


    @Override
    @Transactional(readOnly=true) 
    public List<UserLogin> obtenerTodasLasCuentas() {        
        List<UserLogin> result = userLoginDao.findAll();
        return result;
    }
}

这是因为误导了创建的两个时间(一个在我的服务中,一个在我的单元测试类中):

new ClassPathXmlApplicationContext("applicationContext.xml");

如果你还有什么想说的。。。我非常感谢你的评论。。。非常感谢你们的帮助

 类似资料:
  • 问题内容: 我在Spring3和Hibernte4中遇到上述异常 以下是我的bean xml文件 我的BaseDAO类看起来像这样 以下代码在标题中引发异常 有谁知道如何解决这个问题? 问题答案: 仅在交易范围内有意义。 您需要声明一个适当的事务管理器,划分事务边界并在其中进行数据访问。例如,如下: 。 也可以看看: 10.交易管理 13.3hibernate

  • 问题内容: 我有一个使用spring和hibernate的java stuts2 Web应用程序。 我越来越。 SpringBean.xml hibernate.cfg.xml CustomerServiceImpl.java CustomerDaoImpl.java CustomerAction.java 我得到的例外 问题答案: 您在Spring配置中指定了一个事务管理器,但是没有关于何时或何

  • 我得到以下错误 服务级别 刀类钻头 这个在我application-context.xml 有人能指出为什么我会得到下面的错误吗?

  • org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常为org.hibernate.hibernateException:未找到当前线程的会话org.springframework.web.servlet.frameworkServlet.processRequest(frameworkServlet.java:973)org

  • 问题内容: 我收到以下错误 服务等级 DAO类 我在我的application-context.xml中有这个 谁能发现我为什么出现以下错误? 问题答案: 您使用@Transactional为Dao类添加了注释,但没有为服务类添加注释。该行: 要求您进行交易。 您可以通过将@Transactional批注添加到ProfileService类,或者只添加registerVisitor()方法来解决此

  • 问题内容: 我有一个使用spring和hibernate的java stuts2 Web应用程序。 我越来越。 SpringBean.xml hibernate.cfg.xml CustomerServiceImpl.java CustomerDaoImpl.java CustomerAction.java 我得到的例外 问题答案: 您在Spring配置中指定了一个事务管理器,但是没有关于何时或何