我希望使用Spring测试框架来测试Hibernate Session的save()方法。 @Test方法如下:
@Test
@Transactional
public void testSave() {
User expected = createUser();
getGenericDao().currentSession().save(expected);
User actual = getUser(generatedId);
assertUsersEqual(expected,actual);
}
我想将用户刷新到数据库中。在这个方法之后,我希望我的用户出现在数据库中。
getGenericDao().currentSession().save(expected);
然后我想使用Spring Data框架访问数据库,并通过下一行获取保存的用户:
然后我想使用 Spring Data 框架访问数据库,并通过下面的代码获取已保存的用户:
User actual = getUser(generatedId);
我尝试使用Hibernate的flush方法,例如:
currentSession().setFlushMode(MANUAL);
//do saving here
currentSession().flush();
它无法将我的用户刷新到数据库中!但是如果我不使用@Transactional Spring注解并在编程式Spring事务中保存我的用户,则可以实现我想要的效果。但是,由于没有Spring @Transactional,因此保存到数据库中的用户不会回滚。因此,我的测试方法会更改数据库和随后的测试方法的行为。
因此,我需要在测试方法内部刷新我的用户到数据库中(而不是在末尾),并在测试方法结束时将所有更改回滚到数据库。
更新建议准备方法如下:
@Transactional
public void doSave(User user){
getGenericDao().currentSession().save(user);
}
在testSave函数中调用doSave函数没有任何作用。执行此方法后,我在数据库中仍然找不到用户。我设置了断点并从命令行检查了我的数据库。
更新非常感谢您的回复。问题是flush()方法没有将我的用户放入数据库中。我尝试了Isolation.READ_UNCOMMITTED,但它没有将我的用户放入数据库中。我只有在关闭@Test方法上的Spring事务并以编程方式进行保存时才能实现想要的效果。但是,@Test方法将不会回滚,为随后的@Test方法保留已保存的用户。在这里,保存用户的@Test方法并不像删除用户的@Test方法那样危险,因为它不会回滚。因此,必须对带有@SpringTransactional支持的@Test方法进行Spring事务处理,但我无论如何都不能将我的用户(或删除)放入数据库中。实际上,只有在@Test方法结束并且@Test方法的事务被提交之后,用户才会被(删除)放入数据库中。因此,我希望在@Test方法中间将我的用户保存到数据库中,并在@Test方法结束时将其回滚
谢谢!