清除购物车时如何处理数据库中的cartitems

时间:2011-09-07 12:11:34

标签: java jpa mapping shopping-cart

我有一个ShoppingCart有一组CartItem个对象。当我保存购物车时,所有的卡通项目也会被保存。当买家确认购买时,我需要清理购物车。如果我现在将购物车保存到数据库,那么已经保存在数据库中并与购物车相关联的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;
...

} 
}

db

中的shoppingcart表
id  | buyer_id 
-----+-------------
 100 |   50

cartitem表可以

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

所以在我清理了购物车并将其保存到数据库之后,如果这些物品仍然在数据库中,则意味着购物车12仍然引用购物车100.但是,id = 100的购物车没有购物车,因为我已经清除了它们。 那么,清理购物车并将其保存到数据库相当于删除购物车? 我如何映射这种行为?或者我的想法有缺陷吗?

2 个答案:

答案 0 :(得分:1)

您可以使用orphanRemoval(JPA 2),也可以为每个项目调用em.remove()。

请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Orphan_Removal_.28JPA_2.0.29

否则,项目仍然存在。

如果您希望项目保留在数据库中,则只需将其购物车设置为null即可将其从购物车中删除。

答案 1 :(得分:1)

您尚未发布有关如何清算购物车的代码,因此我的答案会做出相当多的假设。

根据表格的内容,我假设您已在cartItems.clear()课程中调用了ShoppingCart。此调用的问题在于您的关系是双向的,因此CartItem实例将继续将引用返回到ShoppingCart实例,尽管相反的情况并非如此。根据您使用的JPA提供程序,清除Set并使用数据库更新持久性上下文内容将不会清除cartitem表或将抛出异常,指出cart_id不能为null(如果您的外键不可为空)。

大多数JPA提供程序(特别是在Hibernate中)的修复是清除ShoppingCart实例中CartItem的引用以及cartItems中的ShoppingCart设置。请注意,如果您选择使用@OneToMany注释的orphanRemoval属性(自JPA 2.0以来支持)删除孤立的条目,则所有孤立的CartItems(未被{ShoppingCart引用在清除双向关系时,数据库中也将删除1}})。如果orphanRemoval属性设置为true,则JPA提供程序不会尝试删除CartItem不再引用的ShoppingCart;该事务最终会成功,具体取决于您的cartitem表中的外键是否可以为空。

如果您打算在数据库中保留CartItem条记录,但只是取消对ShoppingCart的引用,那么您应该将引用指定为可空(使用@Column注释,并且还将表定义为具有可为空的外键。)