2011-09-07 129 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注解,同时也定义了表有一个可为空外键)。