相关疑难解决方法(0)

如何在活跃的spring事务中将数据刷新到db?

我想使用spring测试框架测试hibernate session的save()方法.@Test方法是:

@Test
@Transactional
public void testSave() {
    User expected = createUser();
    getGenericDao().currentSession().save(expected);
    User actual = getUser(generatedId);
    assertUsersEqual(expected,actual);
}
Run Code Online (Sandbox Code Playgroud)

我想将用户刷新到数据库中.我想让我的用户在这个方法之后进入数据库

getGenericDao().currentSession().save(expected);
Run Code Online (Sandbox Code Playgroud)

然后我想使用spring数据框架转到数据库,并通过下一行获取此保存的用户:

User actual = getUser(generatedId);
Run Code Online (Sandbox Code Playgroud)

我尝试使用hibernate flush方法,如:

currentSession().setFlushMode(MANUAL);
//do saving here
currentSession().flush();
Run Code Online (Sandbox Code Playgroud)

它不会将我的用户刷新到数据库中!但是,如果我没有使用@Transactional spring注释并将我的用户保存在编程弹簧事务中,那么我实现了我想要的.不幸的是,由于没有spring @Transactional,因此保存到db的用户不会回滚.因此,我的测试方法会更改后续测试方法的db和行为.

所以我需要将我的用户刷新到db里面的测试方法(不是在最后),并在测试方法结束时回滚所有对db的更改.

UPDATE建议准备方法如下:

@Transactional
public void doSave(User user){
    getGenericDao().currentSession().save(user);
}
Run Code Online (Sandbox Code Playgroud)

并且在testSave中调用doSave什么都不做.执行此方法后,我仍然没有db中的用户.我设置断点并从命令行检查我的数据库.

更新非常感谢您的回复.问题是方法flush()不会将我的用户放入数据库.我尝试了Isolation.READ_UNCOMMITTED并且它没有将我的用户放入数据库.我可以实现我想要的,但前提是我在@Test方法上关闭spring事务并在程序化事务中保存.然后@Test方法不回滚,为后续的@Test方法留下保存的用户.这里保存用户的@Test方法不像删除用户的@Test方法那样危险,因为它没有回滚.因此必须对@Test方法提供Spring事务支持,我无法将我的用户(或删除)放入db.实际上,只有在@Test方法结束并且@Test方法的事务被调用后,才会将用户放入(或删除)到db中.所以我想在@Test方法的中间将我的用户保存到db中,并在@Test方法结束时回滚它

谢谢!

java hibernate spring-test hibernate-session spring-transactions

15
推荐指数
3
解决办法
3万
查看次数

使用@Async嵌套@Transactional方法

我正在使用Spring和JPA.我@EnableAsync@EnableTransactionManagement开启.在我的用户注册服务方法中,我有一些我称之为注释的其他服务方法@Async.这些方法可以执行各种操作,例如发送欢迎电子邮件以及使用我们的第三方支付系统注册新创建的用户.

在我想验证第三方支付系统是否成功创建用户之前,一切正常.此时,该@Async方法尝试创建一个UserAccount(引用新建的User)和错误输出javax.persistence.EntityNotFoundException: Unable to find com.dk.st.model.User with id 2017

注册调用如下所示:

private User registerUser(User newUser, Boolean waitForAccount) {
    String username = newUser.getUsername();
    String email = newUser.getEmail();

    // ... Verify the user doesn't already exist

    // I have tried all manner of flushing and committing right here, nothing works
    newUser = userDAO.merge(newUser);

    // Here is where we register the new user with the payment system.
    // The User we …
Run Code Online (Sandbox Code Playgroud)

java spring jpa spring-transactions

11
推荐指数
1
解决办法
1万
查看次数