为购物车商品和产品设置正确的jpa映射

jon*_*ter 5 java mapping jpa relation

我正在通过一些示例来学习jpa,涉及购物车和购物车项目。我对它们的定义如下。.但是我不确定要使用哪个映射

@Entity
class Product{

   private Long id;
   private String name;
   ...
}

@Entity
class CartItem{
   private Long id;

   private Product product;

   private int quantity;

...
}

@Entity
class ShoppingCart{
   private Long id;

   @OneToMany
   private Set<CartItem> cartItems;

  ...
}
Run Code Online (Sandbox Code Playgroud)

我不太确定的是,如何建立关系Product and CartItem以及如何设置mappedBy属性。有人可以告诉我该怎么做吗?执行此操作的条件是什么?我试图设置类似的内容。1 cartitem contains 1 product only这听起来像是一种OneToOne关系。如果是这样,谁保持关系(是不是mappedBy呢?)我也有类似的怀疑ShoppingCartCartItem

提前致谢

JB *_*zet 6

一件购物车商品引用一种产品。但单个产品被多个购物车项目引用。所以这是一个一对多的关联。

一个购物车作为多个商品,而一个商品是一个购物车的一部分,因此它也是一对多关联。

当您有双向 OneToMany 关联时,关联的所有者端始终是多端。关联的所有者一侧是没有mappedBy属性的一侧。事实上,mappedBy意味着“我只是关联的另一端,它已经由以下属性映射”。请注意,关联的映射方式(连接列、连接表)必须仅在属性mappedBy不存在的所有者端定义。

当您具有单向关联时,只有一个位置可以定义映射,因此永远不会使用mappedBy 属性。

因此,您的实体应该像这样映射:

@Entity
class Product{

   private Long id;
   private String name;
   ...
}

@Entity
class CartItem{
   private Long id;

   @ManyToOne
   private Product product;

   private int quantity;

...
}

@Entity
class ShoppingCart{
   private Long id;

   @OneToMany
   private Set<CartItem> cartItems;

  ...
}
Run Code Online (Sandbox Code Playgroud)

如果您希望购物车项目了解其所属的购物车,则您的关联将变为双向,并且实体将变为:

@Entity
class CartItem{
   private Long id;

   @ManyToOne
   private Product product;

   @ManyToOne
   private ShppingCart shoppingCart;

   private int quantity;

...
}

@Entity
class ShoppingCart{
   private Long id;

   @OneToMany(mappedBy = "shoppingCart")
   private Set<CartItem> cartItems;

  ...
}
Run Code Online (Sandbox Code Playgroud)