gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:45:30 24 4
gpt4 key购买 nike

我有一个实体膳食计划,其中每个工作日(枚举) 都包含膳食。这是通过 map 和多对多关系来实现的,如下所示:

@Entity
public class Mealplan {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@ManyToMany
@SortNatural
private Map<Weekday, Meal> mealsPerWeek;

(...)

}

这意味着,在我的数据库中,mealsPerWeek 属性存储在一个额外的表中。 “mealplan_meals_per_week”。该表包含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 中使用实体,因此您可以使用 native SQL 来使用 nativeQuery 定义查询。

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

关于java - 从多对多关系中删除映射中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61111229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com