我有一个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的购物车没有购物车,因为我已经清除了它们。 那么,清理购物车并将其保存到数据库相当于删除购物车? 我如何映射这种行为?或者我的想法有缺陷吗?
答案 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
注释,并且还将表定义为具有可为空的外键。)