Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当shoppingcart被清除时,如何处理db中的cartitems_Java_Jpa_Mapping_Shopping Cart - Fatal编程技术网

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