Вот две Entity, Dish и OrderItem связаны OneToMany и ManyToOne.
При попытке удалить Dish - вот такая проблема.
@OnDelete(action = OnDeleteAction.CASCADE)
Проблему не решает.
Вот ошибка полностью:
org.postgresql.util.PSQLException: ОШИБКА: UPDATE или DELETE в таблице "dish" нарушает ограничение внешнего ключа "fks7aplknkrukmckr29wijlvcy1" таблицы "order_item"
Подробности: На ключ (id)=(602) всё ещё есть ссылки в таблице "order_item".
Две Entity ( без лишних деталей ).
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class Dish extends AbstractBaseEntity{
@OnDelete(action = OnDeleteAction.CASCADE)
@OneToMany(cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
mappedBy = "dish")
@ToString.Exclude
private List<OrderItem> orderItems;
}
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class OrderItem extends AbstractBaseEntity{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dish_id")
private Dish dish;
}
AbstractBaseEntity нужен для переопределения equals и hashcode и выноса общего поля id.
@MappedSuperclass
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class AbstractBaseEntity {
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "seq_gen")
@SequenceGenerator(
name = "seq_gen")
protected long id;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AbstractBaseEntity that = (AbstractBaseEntity) o;
if (id == 0) return false;
return id == that.id;
}
@Override
public int hashCode() {
if (id != 0) {
return Objects.hash(id);
} else {
return super.hashCode();
}
}