2011-09-07 65 views
0

我有一個ShoppingCart其中有一套CartItem對象。當我保存購物車時,所有cartitems也被保存。當買家確認購買時,我需要清除購物車。如果我現在將購物車保存到數據庫,那麼已經保存在數據庫中並與購物車相關聯的cartitems應該發生什麼變化?我應該從db中刪除它們嗎?如何清除購物車中的cartitems

實體的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; 
... 

} 
} 

在分貝購物車表

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

cartitem表可以

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

所以之後我清空購物車,並將其保存到分貝,如果這些項目仍然在分貝,這將意味着cartitem 12仍然指購物車100.但是,購物車與id = 100,因爲我清除了它們,所以沒有cartitems。 那麼,清理購物車並將其保存到db相當於刪除購物車? 如何映射這種行爲?或者我的思想存在缺陷?

+1

檢查您的JPA提供程序是否支持像Hibernate「delete-orphan」這樣的東西,因爲JPA不提供這樣的東西。 – Augusto

+0

爲什麼你需要保存購物車?它可以在不同的會話中重用嗎? – jasalguero

+0

我假設任何時候應用程序中的購物車狀態應該與其狀態相同 – jimgardener

回答

1

您尚未發佈關於如何清算購物車的代碼,因此我的回答會做出相當多的假設。

按照表格的內容,我假設你在ShoppingCart類中調用了cartItems.clear()。此調用的問題是您的關係是雙向的,因此CartItem實例將繼續具有返回到ShoppingCart實例的引用,雖然相反情況並非如此。根據您使用的JPA提供程序,清除Set並使用數據庫更新持久化上下文內容將不會清除cartitem表,或者將拋出異常,指出cart_id不能爲空(如果您的外鍵不可爲空)。

在大多數JPA提供商的修復程序(特別是在休眠)是清除參考ShoppingCartCartItem實例除了cartItems設置在ShoppingCart。請注意,如果您選擇使用@OneToMany註釋(自JPA 2.0開始支持)的orphanRemoval屬性刪除孤立條目,則所有孤立的CartItems(未由ShoppingCart引用)也將在數據庫中刪除,同時清除雙向關係。如果沒有將orphanRemoval屬性設置爲true,那麼您的JPA提供程序將不會嘗試刪除不再由ShoppingCart引用的CartItem;交易將最終取得成功,具體取決於cartitem表中的外鍵是否可以爲空。

如果您打算保留CartItem記錄在數據庫中,而僅僅是抵消了參考ShoppingCart,那麼你就應該指定參考可爲空(使用@Column註解,同時也定義了表有一個可爲空外鍵)。

相關問題