从多对多关系中删除映射中的对象



我有一个实体Mealplan,其中每个weekday (enum)都包含一个meal。这是通过地图和像这样的多对多关系来实现的:

@Entity
public class Mealplan {
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToMany
@SortNatural
private Map<Weekday, Meal> mealsPerWeek;
(...)
}

这意味着,在我的数据库中,mealsPerWeek属性存储在一个额外的表中。"每周用餐计划"。该表包含mealplan_id、meal_per_week_id(mealID(和weekday_id。

现在,如果我删除了一个Mealplan,所有的东西都会像我预期的那样被删除。但如果我想删除Meal,会发生以下SQL错误:

org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referentielle Integrität verletzt: "FKPIBLWWQG1HR2D5W7BGORA9XBB: PUBLIC.ESSENSPLAN_ESSEN_PRO_WOCHE FOREIGN KEY(ESSEN_PRO_WOCHE_ID) REFERENCES PUBLIC.ESSEN(ID) (1)"
Referential integrity constraint violation: "FKPIBLWWQG1HR2D5W7BGORA9XBB: PUBLIC.ESSENSPLAN_ESSEN_PRO_WOCHE FOREIGN KEY(ESSEN_PRO_WOCHE_ID) REFERENCES PUBLIC.ESSEN(ID) (1)"; SQL statement:
delete from essen where id=? [23503-200]

我希望如果我删除了一份餐食,用餐计划中的行会被删除,但其他内容都保持不变。

注:CasdadeType。REMOVE不是一个选项,因为它也删除了每个膳食计划,我想删除的膳食就在其中。

@Entity
public class Essen {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
}

mealplan_meals_per_week表中,meal_per_week_id列中引用了Meal。因此,您试图在没有级联引用的情况下删除Meal的位置无法解决。

因此,首先删除mealplan_meals_per_week表中对Meal的引用,然后删除Meal

由于mealplan_meals_per_week没有使用Entity,因此可以使用本机SQL使用本机查询来定义查询。

@Query(
value = "DELETE FROM mealplan_meals_per_week m WHERE m.meal_per_week_id= ?1", 
nativeQuery = true)
void deleteByMealId(Interger mealId);

最新更新