5

我正在通过一些示例学习 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;

  ...
}

我不太确定的是如何关联Product and CartItem以及如何设置mappedBy属性。有人可以告诉我怎么做吗?这样做的标准是什么?我试图设置类似的东西。1 cartitem contains 1 product only听起来像一个OneToOne关系.如果是这样,谁维护这种关系(这不是什么吗?)。我也对and smappedBy有类似的疑问ShoppingCartCartItem

提前致谢

4

2 回答 2

5

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

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

当您有一个双向 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;

  ...
}

如果您希望您的购物车项目了解其拥有的购物车,您的关联将变为双向,实体变为:

@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;

  ...
}
于 2011-09-05T13:45:47.367 回答
3

您应该首先决定是否需要单向或双向@OneToOne关系。单向关系具有拥有侧(存在对另一个类的引用的一侧),而双向关系具有拥有侧和反向侧。

如果要声明单向@OneToOne关系,则无需担心mappedBy属性。例如,如果您将Product-CartItem关系声明为与拥有该关系的单向关系CartItem(并且还拥有数据库中的外键),那么您只需ProductProduct类中注释对 的引用,如下所示;类中不需要更改Product

@Entity
class CartItem{
   private Long id;

   @OneToOne
   private Product product;

   private int quantity;

...
}

如果您需要双向关系,则必须定义双向引用。在这种情况下,您需要CartItemProduct类中添加对 a 的引用。此外,您需要mappedBy在反面指定属性,以引用拥有方(数据库中具有外键的一方),如下所示:

@Entity
class Product{

   private Long id;
   private String name;
   @OneToOne(mappedBy="product") // the name of the property in the owning side
   private CartItem cartItem;
   ...
}

@Entity
class CartItem{
   private Long id;

   @OneToOne                    //the owning side
   private Product product;

   private int quantity;

...
}
于 2011-09-05T13:46:03.417 回答