我正在使用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) 我有一个非常标准的MVC设置,包括用于DAO层的Spring Data JPA存储库,一个处理Transactional关注和实现业务逻辑的Service层,以及一个具有一些可爱的基于REST的JSON端点的视图层.
我的问题是将Java 8批量采用Stream
到这个可爱的架构中:如果我的所有DAO都返回Stream
s,我的服务返回那些相同的Stream
s(但是做Transactional工作),我的视图处理并处理这些Stream
,然后通过当我的视图开始处理我的Stream
s中的Model对象时,Service层创建的事务将被关闭.如果底层数据存储尚未实现我的所有模型对象(它Stream
毕竟是尽可能的懒惰),那么我的视图将在尝试访问事务之外的新结果时出错.以前这不是问题,因为我会将结果完全实现到List中 - 但现在我们处于Stream
s 的勇敢新世界.
那么,处理这个问题的最佳方法是什么?完全将服务层内的结果实现为List并将其交还?让View层将Service层交给一个完成块,以便在事务内部进行进一步的处理吗?
谢谢您的帮助!