我有一个实体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);