您好,我正在申請食譜。一個用戶可以有很多食譜,然后他可以洗掉他的食譜。我將日期存盤在資料庫中。用戶在 db 的一個欄位中有一個食譜串列。我不知道如何洗掉該串列中的食譜。我在資料庫中洗掉了一個食譜,但它仍在用戶欄位中的串列中,因此我們仍然可以訪問該食譜。我使用 JpaResporitory 。我給出了一部分代碼。請問你能幫幫我嗎 ?
public ResponseEntity<String> deleteRecipeById(long id, @AuthenticationPrincipal UserDetails details) {//toDo
Recipe currentRecipe = getRecipeById(id);
User currentUser = userRepository.findByEmail(details.getUsername())
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
if(currentRecipe.getUser().equals(currentUser) ){
currentUser.deleteFromUserList(currentRecipe);
recipeRepository.delete(currentRecipe);
// AND WHAT HERE ?
return ResponseEntity.status(HttpStatus.OK).build();
}
return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
@Entity
@Getter
@Setter
@RequiredArgsConstructor
public class Recipe {
...
@JsonIgnore
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;
}
@Entity
@Table(name = "users")
@Getter
@Setter
@RequiredArgsConstructor
class User {
...
@JsonIgnore
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL,orphanRemoval = true , fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@ToString.Exclude
@Column(name = "recipes")
private List<Recipe> recipes = new ArrayList<>();
} THERE IS THAT LIST THAT I CAN'T CHANGE AND NEED THIS TO DELETE RECIPE
這是我如何保存食譜
public Long create(Recipe recipe, UserDetails details) {
User currentUser = userRepository.findByEmail(details.getUsername())
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
recipe.setUser(currentUser);
currentUser.getRecipes()
.add(recipe);
userRepository.save(currentUser);
return userRepository.findByEmail(details.getUsername())
.orElseThrow(() -> new UsernameNotFoundException("User not found"))
.getRecipes()
.get(userRepository.findByEmail(details.getUsername())
.orElseThrow(() -> new UsernameNotFoundException("User not found"))
.getRecipes()
.size() - 1)
.getId();
}
我嘗試谷歌搜索我閱讀了有關 jpa 的文章,但我仍然不知道我必須做什么
uj5u.com熱心網友回復:
好的,鑒于您發布的資訊,真正的問題是您從中洗掉recipe但之后user不保存user
你要么這樣做:
1-從用戶userRepository.save(currentUser)中洗掉后呼叫recipe
或者更好 >
2-注釋deleteRecipeById并@Transactional完成作業
如果您想知道 2 號將如何完成這項作業,那是因為當您從 DB 中加載物體時user,該物體將處于托管狀態,這意味著如果您對該物體進行任何更新,recipes.remove(recipe);
那么該托管物體user將有資格進行更新,如果您在一個打開的事務中并且該事務被提交[意味著帶有@Transactional 的函式注釋結束] 托管物體user更新將被寫入資料庫,它將發出更新 SQL 查詢以receipe從用戶中洗掉它
*提示,順便說一句,你不能在沒有事務范圍的情況下對資料庫使用寫操作,你recipe在呼叫
recipeRepository.delete(currentRecipe);
它時洗掉的事實是因為默認情況下 Spring 存盤庫被注釋,@Transactional這就是為什么解決方案 2 更好,因為現在你只會使用兩個操作的一個事務而不是將發出 2 個事務的 1 號解決方案
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/537610.html
