你好,我正在做一个食谱的应用程序。一个用户可以有很多食谱,然后他可以删除他的食谱。我在数据库中存储日期。用户在数据库中的一个字段中有一个食谱列表。我不知道该怎么做才能删除那个列表中的食谱。我删除了数据库中的一个食谱,但仍然在用户字段中的列表中,所以我们仍然可以访问那个食谱。我使用JpaResporital。在那里我给予了我的一部分代码。你能帮我一下吗?
第一个
这是我如何保存食谱
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的文章,但我仍然不知道我必须做什么
1条答案
按热度按时间j5fpnvbx1#
好吧,根据你发布的信息,真实的的问题是你从
user
中删除了recipe
,但之后你没有保存user
您可以:
1-从用户中删除
recipe
后,调用userRepository.save(currentUser)
或更好〉
2-使用
@Transactional
注解deleteRecipeById
,它将完成此任务如果您想知道第2个实体将如何完成这项工作,这是因为当您从此处的数据库加载实体
user
时,该实体将处于托管状态,这意味着如果您对该实体(如recipes.remove(recipe);
)进行任何更新,则该托管实体user
将符合更新条件。如果您在一个打开的事务中,并且该事务被提交[意味着带有@Transactional的函数注解结束]受管实体user
更新将写入DB,DB将发出更新SQL查询以从用户中删除该receipe
recipeRepository.delete(currentRecipe);
时删除了recipe
,这是因为Spring仓库默认情况下使用@Transactional
进行注解,这就是为什么解决方案2更好,因为现在您将仅对两个操作使用一个事务,而不是解决方案1发出2个事务