如何清除购物车中的cartitems
我有一个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相当于删除购物车? 如何映射这种行为?或者我的思想存在缺陷?
您尚未发布关于如何清算购物车的代码,因此我的回答会做出相当多的假设。
按照表格的内容,我假设你在ShoppingCart
类中调用了cartItems.clear()
。此调用的问题是您的关系是双向的,因此CartItem
实例将继续具有返回到ShoppingCart
实例的引用,虽然相反情况并非如此。根据您使用的JPA提供程序,清除Set
并使用数据库更新持久化上下文内容将不会清除cartitem
表,或者将抛出异常,指出cart_id
不能为空(如果您的外键不可为空)。
在大多数JPA提供商的修复程序(特别是在休眠)是清除参考ShoppingCart
在CartItem
实例除了cartItems
设置在ShoppingCart
。请注意,如果您选择使用@OneToMany
注释(自JPA 2.0开始支持)的orphanRemoval
属性删除孤立条目,则所有孤立的CartItems
(未由ShoppingCart
引用)也将在数据库中删除,同时清除双向关系。如果没有将orphanRemoval
属性设置为true,那么您的JPA提供程序将不会尝试删除不再由ShoppingCart
引用的CartItem
;交易将最终取得成功,具体取决于cartitem表中的外键是否可以为空。
如果您打算保留CartItem
记录在数据库中,而仅仅是抵消了参考ShoppingCart
,那么你就应该指定参考可为空(使用@Column
注解,同时也定义了表有一个可为空外键)。
您可以使用orphanRemoval(JPA 2),或者为每个项目调用em.remove()。
见, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Orphan_Removal_.28JPA_2.0.29
否则,该项目将仍然存在。
如果您希望物品保留在数据库中,那么只需将其购物车设置为空即可将其从购物车中移除。
检查您的JPA提供程序是否支持像Hibernate“delete-orphan”这样的东西,因为JPA不提供这样的东西。 – Augusto
为什么你需要保存购物车?它可以在不同的会话中重用吗? – jasalguero
我假设任何时候应用程序中的购物车状态应该与其状态相同 – jimgardener