@Rokoss

UPDATE DELETE нарушает ограничение внешнего ключа ( spring data jpa ), ondelete — не помогает, как решить?

Вот две 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();
        }
    }
  • Вопрос задан
  • 367 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы