【问题标题】:Moving from HibernateTemplate to SessionFactory without @Transactional in tests在测试中不使用 @Transactional 从 HibernateTemplate 迁移到 SessionFactory
【发布时间】:2013-01-15 18:09:40
【问题描述】:

我正在使用 Spring 3 迁移到 Hibernate 4,这意味着我不能再使用 Spring 的 HibernateTemplate。重构代码很容易(在使用会话的地方用 sessionFactory.getCurrentSession() 替换回调),但我的单元测试遇到了问题。特别是,我希望对我的 DAO 进行完全实时的集成测试——不使用 @Transactional。

但是,由于 HibernateTemplate 不再提供在会话未打开时打开会话的方法,因此我收到“未找到当前线程的会话”。当我运行我的测试时,因为 sessionFactory.getCurrentSession() 如果没有打开会话,则不会打开会话。

有没有办法解决这个问题来复制 HibernateTemplate 给我的东西,而无需在我的测试中使用 @Transactional?看起来应该是可能的,但我只能在我用 @Transactional 注释测试类时才能让测试工作(因为它确实打开了一个会话)。

【问题讨论】:

  • 您是否有不希望开始交易的原因?
  • 它增加了开销,对于这些测试来说,这是不必要的。在这种特殊情况下,我觉得开销不会增加任何价值,所以这就是我想要解决的原因。

标签: java spring hibernate transactions integration-testing


【解决方案1】:

如果你使用 Junit 测试,它非常简单。

在您的测试类中,您必须加载 Spring 上下文:

@BeforeClass
public static void createApplicationContext(){      
    try {           
         applicationContext = new ClassPathXmlApplicationContext(
                new String[] {"applicationContext.xml"});           
         yourDao = (YourDao)applicationContext.getBean("YourDao");           
    } catch (Exception e) {
        Assert.assertNull(e);
    }
}

然后就可以使用yourDao,编写测试逻辑了。

【讨论】:

  • 这与 Hibernate 会话有什么关系?
  • 我通过 Spring 上下文配置了一个事务管理器:<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean>。我在 DAO 的方法上使用了注解@Tansaction。然后在这种模式下将我的 DAO 加载到测试类中就可以了。
猜你喜欢
  • 1970-01-01
  • 2014-11-02
  • 2011-11-13
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2022-10-20
  • 2019-09-14
  • 2020-09-07
相关资源
最近更新 更多