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.もしそうなら、誰がその関係を維持していますか? (そうではないですmappedByか?).ShoppingCartCartItem

前もって感謝します

4

2 に答える 2

5

1 つのカート項目が 1 つの商品を参照します。しかし、1 つの商品が複数のカート項目によって参照されています。したがって、これは 1 対多の関連付けです。

1 つのショッピング カートは複数のアイテムであり、アイテムは 1 つのショッピング カートの一部であるため、1 対多の関連付けでもあります。

双方向の OneToMany アソシエーションがある場合、アソシエーションの所有者側は常に側です。mappedBy関連の所有者側は、属性がない側です。確かに、mappedBy私は関連付けの反対側であり、次の属性によって既にマップされている」ことを意味します。mappedByアソシエーションがマップされる方法 (結合列、結合テーブル) は、属性が存在しない所有者側でのみ定義する必要があることに注意してください。

一方向の関連付けがある場合、マッピングを定義できる場所は 1 つしかないため、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-リレーションシップを宣言する場合は、以下に示すように、クラス内の への参照に注釈を付けるだけで済みます。クラスに変更は必要ありません。CartItemCartItemProductProductProduct

@Entity
class CartItem{
   private Long id;

   @OneToOne
   private Product product;

   private int quantity;

...
}

双方向の関係が必要な場合は、双方向の参照を定義する必要があります。この場合、クラスCartItemからへの参照を追加する必要があります。さらに、以下に示すように、所有側 (データベースに外部キーを持つ側) を参照するために、逆側で属性Productを指定する必要があります。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 に答える