Вы не отправили код о том, как очищаете корзину, поэтому в моем ответе будет достаточно предположений.
Если исходить из содержимого таблиц, я предполагаю, что вы 'Вы вызвали cartItems.clear()
в вашем ShoppingCart
классе.Проблема с этим вызовом состоит в том, что ваши отношения являются двунаправленными, и, следовательно, экземпляр CartItem
будет по-прежнему иметь ссылку обратно на экземпляр ShoppingCart
, хотя обратное неверно.В зависимости от того, какого провайдера JPA вы используете, очистка Set
и обновление содержимого постоянного контекста с помощью базы данных либо не очистит таблицу cartitem
, либо выдаст исключение, указывающее, что cart_id
не может быть нулевым (если ваш внешнийключи не обнуляются).
Исправление в большинстве поставщиков JPA (особенно в Hibernate) состоит в том, чтобы очистить ссылку на ShoppingCart
в экземпляре CartItem
в дополнение к cartItems
Set в ShoppingCart
.Обратите внимание, что если вы решите удалить потерянные записи, используя атрибут orphanRemoval
аннотации @OneToMany
(поддерживается начиная с JPA 2.0), то все потерянные CartItems
(на которые не ссылается * 1021)*) также будет удаляться в базе данных, при очистке двунаправленной связи.Если для атрибута orphanRemoval
не задано значение true, ваш поставщик JPA не будет пытаться удалить CartItem
s, на которые больше не ссылается ShoppingCart
;транзакция в конечном итоге будет успешной в зависимости от того, является ли ваш внешний ключ в таблице cartitem обнуляемым или нет.
Если вы намереваетесь сохранить записи CartItem
в базе данных, но просто аннулируете ссылку на ShoppingCart
, тогда вы должны обозначить ссылку как обнуляемую (используя аннотацию @Column
, а также определить таблицу, имеющую обнуляемый внешний ключ).