Festlegen der richtigen JPA -Mapping für Warenkorbartikel und Produkte
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 CartItem
s auch
vielen Dank im Voraus
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;
...
}