установка правильного сопоставления jpa для элементов корзины и продукта - PullRequest
5 голосов
/ 05 сентября 2011

Я изучаю 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 .Itзвучит как OneToOne отношение. Если так, кто поддерживает отношение (разве это не то, что делает mappedBy?). У меня есть подобные сомнения относительно ShoppingCart и CartItem s *

, заранее спасибо

Ответы [ 2 ]

3 голосов
/ 05 сентября 2011

Один товар указывает на один товар.Но на один товар ссылаются несколько товаров в корзине.Таким образом, это ассоциация «один ко многим».

Одна корзина покупок в виде нескольких товаров, и элемент является частью одной корзины, поэтому это также ассоциация «один ко многим».

Если у вас есть двунаправленная ассоциация OneToMany, то ее владельцем всегда является сторона many .Сторона владельца ассоциации - это сторона, где нет атрибута 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;

  ...
}
2 голосов
/ 05 сентября 2011

Вы должны сначала решить, хотите ли вы однонаправленные или двунаправленные @OneToOne отношения. Однонаправленное отношение имеет сторону владения (сторону, где присутствует ссылка на другой класс), в то время как двунаправленное отношение имеет как сторону владения, так и обратную сторону.

Если вы объявляете однонаправленное отношение @OneToOne, вам не нужно беспокоиться об атрибуте mappedBy. Например, если вы объявите отношение Product - CartItem как однонаправленное отношение с CartItem, владеющим отношением (и также имеющим внешний ключ в базе данных), то вам просто нужно аннотировать ссылку на Product в классе Product, как показано ниже; в классе Product не требуется никаких изменений:

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

...
}
...