Невозможно удалить или обновить родительскую строку из-за сбоя ограничения внешнего ключа - PullRequest
0 голосов
/ 08 мая 2020

Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется (gopick. orders_paid_items, ОГРАНИЧЕНИЕ FKeeefhbl6j5xhs7nnt5mn530f8 ИНОСТРАННЫЙ КЛЮЧ (paid_items_product_id, paid_items_user_id) ССЫЛКИ cart (product_id, user_id))

Корзина ниже

    @Entity
    @ToString
    @EqualsAndHashCode
    @IdClass(CartIdPk.class)
    public class Cart implements Serializable {

    @Column(unique = true)
    private Long id = Long.parseLong(String.format("%06d", new Random().nextInt(999999)));

    @JsonIgnore
    @Id
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    private CartStatus cartStatus = CartStatus.IN_CART;

    @Id
    private int productId;

    private int quantity = 0;

    @Column(length = 10, nullable = true)
    private String discount;

    @Column(length = 30, nullable = true)
    private String paymentRef;

    @JsonIgnore
    @Column(insertable = false, updatable = true)
    @UpdateTimestamp
    private Timestamp lastModified;

    @CreationTimestamp
    private Timestamp dateCreated;

}

Id class Object CartIdPk

@NoArgsConstructor
@AllArgsConstructor
@lombok.Data
public class CartIdPk implements Serializable {

    private Long user;

    private int productId;
}

Orders Entity ниже

    @lombok.Data
    @Entity
    public class Orders implements Serializable {

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

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    @OneToMany(fetch = FetchType.LAZY)
    private Collection<Cart> paidItems;

    @JsonIgnore
    @Column(insertable = false, updatable = true)
    @UpdateTimestamp
    private Timestamp lastModified;

    @CreationTimestamp
    private Timestamp dateCreated;

}

Когда я пытаюсь удалить из таблицы сущностей корзины, он отлично работает, если productId отсутствует в сгенерированном orders_paid_items, но если он есть, он выдает ошибку, как указано выше.

Удаление элемент из таблицы корзины с использованием метода удаления по умолчанию CrudRepository, как показано ниже

 cartDataService.remove(cartDataService.find(cartId));

1 Ответ

1 голос
/ 08 мая 2020

Практическое правило при использовании JPA и ORM в java - помнить, что у вас есть как объектная модель, так и модель реляционной базы данных, и вы должны внести изменения в и в .

Значит, между заказами и корзиной стоит 1 ко многим.

Итак, ради аргумента вы пытаетесь удалить корзину, которая в данный момент находится в заказе. Когда произойдет сохранение, вы получите нарушение целостности, так как на эту корзину, которую вы пытаетесь удалить, по-прежнему ссылается заказ.

Что вам нужно сделать, так это удалить заказы с карты перед удалением потому что вы ссылаетесь на корзину в заказах.

Всегда пытайтесь внести изменения на уровне «объекта» и на уровне базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...