2011-06-28 88 views
0

我想创建一个测试用例为使用原生的Hibernate API(无弹簧的东西一样的HibernateTemplate,HibernateDaoSupport的)我的DAO类,就像这样:春/休眠/ TestNG的 - 手动会话和交易建立

sessionFactory.getCurrentSession().save(obj); 

我在春季文档中显示了适当的sessionFactory和transactionManager定义,如春季文档中所示。

我想要的是在我的启动代码中打开一个事务并在最后回滚。

因此,这与每个测试方法调用的默认Spring单元测试支持事务概念不同,因此我无法扩展AbstractTransactionalTestNGSpringContextTests。

我需要一种方式来启动一个事务,并以某种方式在会话工厂中提供它。我觉得这应该是非常容易的,但在阅读和实验之后无法实现。

任何帮助将不胜感激。

回答

1

如果您不想使用HibernateTemplate,您可以直接使用transactionManager,如10.6.2 Using the PlatformTransactionManager中所述。

+0

的测试方法是,这就是我想做的事,但我需要以某种方式对夫妇这休眠会话,这是我的难题。 – Max

+0

@ m17:如果您已经正确配置了'HibernateTransactionManager',它应该自动耦合,请参阅http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/orm.html# orm-hibernate-straight – axtavt

+0

10x很多,它以这种方式工作。 – Max

0
try { 
    Session session = factory.openSession(); 
    Transaction tx = session.beginTransaction(); 
    ... 
    tx.commit(); 
    session.close(); 
} catch (SomeException e) { 
    tx.rollback(); 
    ... 
} 
+0

其实我不能使用这个,因为我的DAO在内部使用sessionFactory.getCurrentSession()。所以我需要一种方法来“保存”会话和关联事务。 在生产环境中,我在服务层使用了spring声明式事务,并且所有事情都对我透明。但在测试中,我需要手动处理这个“透明度” – Max

+0

@ m17啊,我看,没有通过我猜想你的问题。在我的DAO中,我通常创建getSession()和setSession()方法,以便我可以使用DAO IOC。所以在我的junit测试中,我创建了会话,有或没有事务,并将其设置在DAO上。 –

0

@Transactional(唯读=假,传播= Propagation.REQUIRED)

注释使用上述

+0

据我了解,这将把每个方法都包含在单独的事务中。如果没有抛出异常,它会提交这个事务。 – Max

+0

是的,您可以注释方法并开始交易 –