java 如何让父母知道他们的孩子被删除了?

3npbholx  于 2022-11-20  发布在  Java
关注(0)|答案(1)|浏览(127)

你好,我正在做一个食谱的应用程序。一个用户可以有很多食谱,然后他可以删除他的食谱。我在数据库中存储日期。用户在数据库中的一个字段中有一个食谱列表。我不知道该怎么做才能删除那个列表中的食谱。我删除了数据库中的一个食谱,但仍然在用户字段中的列表中,所以我们仍然可以访问那个食谱。我使用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的文章,但我仍然不知道我必须做什么

j5fpnvbx

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个事务

相关问题