我使用TestNG + Spring + hibernate。 当我在@BeforeClass中使用事务时,我得到:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
代码示例:
@Transactional(transactionManager = "transactionManager")
@Rollback
@ContextConfiguration(locations = "/WEB-INF/testing/applicationTestContext.xml")
@TestExecutionListeners(listeners = {
ServletTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
SqlScriptsTestExecutionListener.class,
WithSecurityContextTestExecutionListener.class
})
public abstract class ExampleOfTest extends AbstractTestNGSpringContextTests{
@Autowired
private SessionFactory sessionFactory;
@BeforeClass
public void setUpClass() {
sessionFactory.getCurrentSession().beginTransaction(); // get HibernateException
sessionFactory.getCurrentSession().getTransaction().commit();
}
....
}
如何在@BeforeClass中使用交易? 我想将它用于所有类测试中使用的一次性数据输入。
答案 0 :(得分:1)
问题是@EnableTransactionManagement
应该在你的春天背景中
或
尝试类似
的内容// BMT idiom with getCurrentSession()
try {
UserTransaction tx = (UserTransaction)new InitialContext()
.lookup("java:comp/UserTransaction");
tx.begin();
// Do some work on Session bound to transaction
sessionFactory.getCurrentSession().persist(...);
tx.commit();
}
catch (RuntimeException e) {
tx.rollback();
throw e; // or display error message
}
getCurrentSession类似于受限制,它应该在活动事务中运行。
我认为这可能会有所帮助。