删除其他实体中@ManyToMany引用的hibernate实体

时间:2017-05-24 13:28:49

标签: java spring hibernate spring-data

我想删除Recipe(使用Spring数据DAO)但我得到SQL异常:@Entity public class Account { @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "favourite_recipes", joinColumns = @JoinColumn(name = "account_id"), inverseJoinColumns = @JoinColumn(name = "recipe_id")) private Set<Recipe> favouriteRecipes = new HashSet<>(0); ... } @Entity public class Recipe { ... }

我的实体:

<form action="./manageteams/<?php echo $_GET['t']; ?>" method="post" enctype="multipart/form-data">

如何删除食谱实例?

3 个答案:

答案 0 :(得分:0)

您需要处理级联类型,默认情况下设置为ALL。

例如,你可以解决这样的约束:

@ManyToMany(cascade = CascadeType.DETACH)

更多信息:cascade type docs

答案 1 :(得分:0)

您需要从拥有实体一侧删除帐户。

首先从帐户中的食谱列表中删除食谱并保存帐户,然后删除食谱本身。

答案 2 :(得分:0)

正如Amer Qarabsa所说,我必须从账户中删除食谱。

  1. 我在Recipe中添加了新字段以获得双向映射

    @ManyToMany(cascade = CascadeType.MERGE, mappedBy = "favouriteRecipes")
    private Set<Account> recipeLovers = new HashSet<>(0);
    
  2. 服务类中的代码从所有帐户中移除配方+配方中的清除爱好者(配方和recipeId变量未在此处初始化)

    Set<Account> recipeLovers = recipe.getRecipeLovers();
    recipeLovers.forEach(account ->
        account.getFavouriteRecipes()
            .removeIf(r -> r.getId() == recipeId));
    recipeLovers.clear();
    recipeDao.delete(recipe);