Frage

Ich lerne JPA anhand einiger Beispiele, an denen ein Warenkorb und einen Warenkorb einbezieht. Ich habe sie wie unten definiert. Ich bin mir jedoch nicht sicher

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

  ...
}

Was ich nicht ganz sicher bin, ist, wie ich mich dazwischen beziehen kann Product and CartItem und wie man die festlegt mappedBy Attribut. Kann mir jemand sagen, wie ich das tun soll? Was sind die Kriterien dafür? Ich habe versucht, so etwas festzulegen 1 cartitem contains 1 product only. Es klingt wie a OneToOne Beziehung. Wenn dies die Beziehung aufrechterhält (ist das nicht was mappedBy tut?). Ich habe ähnliche Zweifel daran ShoppingCart und CartItems auch

vielen Dank im Voraus

War es hilfreich?

Lösung

Ein Wagenelement verweist ein Produkt. Ein einzelnes Produkt wird jedoch durch mehrere Karren -Artikel verwiesen. Es ist also eine Eins-zu-Viele-Vereinigung.

Ein Einkaufswagen als mehrere Artikel, und ein Artikel ist Teil eines Einkaufswagens, daher ist es auch eine Eins-zu-Viele-Vereinigung.

Wenn Sie eine bidirektionale Onetomany Association haben, ist die Eigentümerseite der Vereinigung immer die viele Seite. Die Eigentümerseite eines Vereins ist die Seite, an der es keine gibt mappedBy Attribut. In der Tat, mappedBy meint "Ich bin nur die andere Seite eines Vereins, der bereits durch das folgende Attribut zugeordnet ist". Beachten mappedBy Attribut fehlt.

Wenn Sie eine unidirektionale Assoziation haben, gibt es nur einen Ort, an dem die Zuordnung definiert werden kann, und das zugeordnete Attribut wird daher nie verwendet.

Ihre Entitäten sollten also so zugeordnet werden:

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

  ...
}

Wenn Sie möchten, dass Ihr Warenkorb über seinen eigenen Einkaufswagen wird, wird Ihr Verband bidirektional und die Unternehmen werden:

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

  ...
}

Andere Tipps

Sie sollten zuerst entscheiden, ob Sie ein unidirektionales oder eine bidirektionale wollen @OneToOne Beziehung. Eine unidirektionale Beziehung hat eine besitzende Seite (die Seite, auf der der Hinweis auf eine andere Klasse vorhanden ist), während eine bidirektionale Beziehung sowohl eine eigene Seite als auch eine umgekehrte Seite hat.

Wenn Sie ein unidirektionales deklarieren @OneToOne Beziehung, dann müssen Sie sich keine Sorgen um die machen mappedBy Attribut. Zum Beispiel, wenn Sie das deklarieren Product-CartItem Beziehung als unidirektionale Beziehung mit der CartItem Wenn Sie die Beziehung besitzen (und auch den Fremdschlüssel in der Datenbank besitzen) Product in dem Product Klasse, wie unten gezeigt; In der sind keine Änderungen erforderlich Product Klasse:

@Entity
class CartItem{
   private Long id;

   @OneToOne
   private Product product;

   private int quantity;

...
}

Wenn Sie eine bidirektionale Beziehung benötigen, müssen Sie Referenzen definieren, die in beide Richtungen gehen. In diesem Fall müssen Sie einen Verweis auf a hinzufügen CartItem von dem Product Klasse. Darüber hinaus müssen Sie die angeben mappedBy Attribut auf der umgekehrten Seite, um sich auf die besitzende Seite zu beziehen (die Seite, die den Fremdschlüssel in der Datenbank hat), wie unten gezeigt:

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

...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top