我有一個場景,用戶在表中保存后,必須創建一個角色,角色表有一個外鍵參考,即 userId。
我在除錯時嘗試撰寫一些代碼,我可以看到該方法被呼叫,但查詢沒有執行。以下是我的代碼,
處理程式
Mono<User> userResponse = service.create(user);
return ServerResponse.status(HttpStatus.CREATED).body(userResponse, User.class).switchIfEmpty(ServerResponse.badRequest().build());
服務
Mono<User> user = this.repository
.create(User.builder().userName(user.getUserName()).build())
.convert().with(toMono());
return user.map(u -> {
this.saveRoleForUser(u);
return u;
});
public void saveRoleForUser(User u) {
this.repository.getRole("roleName").flatMap(i -> {
return this.repository.createRole(Roles.of(null, u.userId, i.getRoleId));
});
}
我可以看到getRole("roleName")在存盤庫中被呼叫,但查詢沒有執行。
存盤庫中沒有錯誤,我想這是因為執行緒阻塞不允許執行此查詢。我嘗試尋找解決方案,但使用 flatMap 應該可以解決我所知道的問題。我什至嘗試從處理程式類中呼叫“ saveRoleForUser ”,但這也不起作用。
存盤庫
public Uni<Role> getRole(String roleName) {
CriteriaBuilder cb = this.sessionFactory.getCriteriaBuilder();
CriteriaQuery<Role> query = cb.createQuery(Role.class);
Root<Role> root = query.from(Role.class);
query.where(cb.equal(root.get("roleName"), roleName));
return this.sessionFactory.withSession(session -> session.createQuery(query).getSingleResultOrNull()).onItem()
.ifNull().switchTo(Uni.createFrom().item(Role.builder().build()));
}
PS:正在創建用戶,我沒有收到任何錯誤或例外。
任何幫助深表感謝。
提前致謝。
uj5u.com熱心網友回復:
這是一些理想情況下代碼應該是什么樣子的示例代碼。這里要注意的最重要的事情是,我們現在將訂閱Mono回傳的 from saveRoleForUser,以確保該函式內部的操作將在訂閱發生后執行。
public Mono<User> createUser() {
return this.repository
.create(User.builder().userName(user.getUserName()).build())
.convert().with(toMono())
.flatMap(u -> this.saveRoleForUser(u));
}
public Mono<User> saveRoleForUser(User u) {
this.repository.getRole("roleName").flatMap(i -> {
return this.repository.createRole(Roles.of(null, u.userId, i.getRoleId));
}).thenReturn(u);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483672.html
標籤:爪哇 弹簧靴 休眠 spring-webflux java-11
