Java 当shoppingcart被清除时,如何处理db中的cartitems
我有一个Java 当shoppingcart被清除时,如何处理db中的cartitems,java,jpa,mapping,shopping-cart,Java,Jpa,Mapping,Shopping Cart,我有一个ShoppingCart,它有一组CartItem对象。当我保存ShoppingCart时,所有cartitems也会保存。当买家确认购买时,我需要清除ShoppingCart。如果我现在将购物车保存到db,已经保存在数据库中并与购物车关联的购物车项目会发生什么情况?我应该从数据库中删除它们吗 实体的jpa映射是 @Entity class ShoppingCart{ ... @OneToOne public Buyer buyer; @OneToMany(mappe
ShoppingCart
,它有一组CartItem
对象。当我保存ShoppingCart时,所有cartitems也会保存。当买家确认购买时,我需要清除ShoppingCart。如果我现在将购物车保存到db,已经保存在数据库中并与购物车关联的购物车项目会发生什么情况?我应该从数据库中删除它们吗
实体的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;
...
}
}
cartitem表可以是
id | quantity | product_id | cart_id
-----+----------+------------+---------
12 | 2 | 234 | 100
--------------------------------------
13 | 4 | 231 | 100
因此,在我清除shoppingcart并将其保存到db之后,如果这些项目仍然在db中,则意味着cartitem 12仍然引用cart 100。但是,id=100的cart没有cartitems,因为我已经清除了它们。
那么,清除购物车并将其保存到db等同于删除购物车吗?
我如何映射这种行为?或者我的想法中是否存在缺陷?您可以使用孤儿删除(JPA 2),或者为每个项目调用em.remove() 看,, 否则,项目仍将存在
如果您希望项目保留在数据库中,则只需将其购物车设置为null即可将其从购物车中删除。您尚未发布有关如何清除购物车的代码,因此我的回答将做出大量假设 查看表的内容,我假设您在
ShoppingCart
类中调用了cartimes.clear()
。此调用的问题是您的关系是双向的,因此cartime
实例将继续引用ShoppingCart
实例,尽管相反的情况并非如此。根据您使用的JPA提供程序的不同,清除集合并使用数据库更新持久性上下文内容将不会清除cartitem
表,或者将引发异常,说明cart\u id
不能为空(如果您的外键不可为空)
大多数JPA提供商(尤其是Hibernate)的修复方法是清除CartItem
实例中对ShoppingCart
的引用,以及ShoppingCart
中设置的cartItems
。请注意,如果您选择使用@OneToMany
注释(自JPA 2.0以来支持)的属性删除孤立条目,则在清除双向关系时,数据库中的所有孤立购物车项目
(未被购物车
引用)也将被删除。如果属性未设置为true,您的JPA提供商将不会尝试删除购物车不再引用的CartItem
s;事务最终是否成功取决于cartitem表中的外键是否可为空
如果您打算在数据库中保留购物车项目
记录,而只是使对购物车
的引用为空,那么您应该将该引用指定为可空(使用@列
注释,并将表定义为具有可空外键).检查您的JPA提供商是否支持Hibernate“delete orphan”之类的功能,因为JPA不提供类似的功能。为什么需要保存购物车?它可以在不同的会话中重用吗?我假设应用程序中的购物车在任何时候的状态都应该和它在db中的状态相同
id | quantity | product_id | cart_id
-----+----------+------------+---------
12 | 2 | 234 | 100
--------------------------------------
13 | 4 | 231 | 100