что делать с cartitems в БД, когда корзина очищена - PullRequest
0 голосов
/ 07 сентября 2011

У меня есть ShoppingCart, у которого есть набор CartItem объектов. Когда я сохраняю корзину покупок, также сохраняются все элементы корзины. Когда покупатель подтверждает покупку, мне нужно очистить корзину покупок. Если я сохраняюЧто теперь произойдет с корзиной, уже сохраненной в БД и связанной с корзиной? Следует ли удалить их из БД?

Отображения jpa сущностей:

@Entity
class ShoppingCart{
...
   @OneToOne
   public Buyer buyer;

   @OneToMany(mappedBy="cart", cascade=CascadeType.ALL)
    public Set<CartItem> cartItems;
 ...
}

@Entity
public class CartItem{
   @ManyToOne
   public ShoppingCart cart;

@OneToOne
   public Product pdt;
   public int quantity;
...

} 
}

таблица корзины покупок в db

id  | buyer_id 
-----+-------------
 100 |   50

таблица cartitem может быть

 id  | quantity | product_id | cart_id 
-----+----------+------------+---------
 12  |        2 |     234    |  100
--------------------------------------
 13  |       4  |     231    |  100

Поэтому после очистки корзины покупок и сохранения ее в db, если эти элементы все еще находятся в базе данных, она будетозначает, что cartitem 12 по-прежнему относится к корзине 100. Но корзина с id = 100 не имеет картем, так как я их очистил.Таким образом, очистка корзины и сохранение ее в дБ эквивалентно удалению корзины?Как мне отобразить это поведение? Или в моем мышлении есть изъян?

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Вы не отправили код о том, как очищаете корзину, поэтому в моем ответе будет достаточно предположений.

Если исходить из содержимого таблиц, я предполагаю, что вы 'Вы вызвали 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, а также определить таблицу, имеющую обнуляемый внешний ключ).

1 голос
/ 07 сентября 2011

Вы можете использовать orphanRemoval (JPA 2) или вызвать em.remove () для каждого элемента.

См, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Orphan_Removal_.28JPA_2.0.29

В противном случае, предметы все еще будут там.

Если вы хотите, чтобы элементы оставались в базе данных, просто установите для их корзины значение null, чтобы удалить их из корзины.

...