嘗試使用一一添加的新值更新購物車的內容時遇到問題。我正在使用帶有 Hibernate、JPA 存盤庫、MySQL 資料庫和使用 vanilla JS 構建的前端的 Spring boot。我將在以下幾行中描述我的問題。
我有一個看起來像這樣的用戶物體:
@Entity
@Table(name = "users")
@Getter
@Setter
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
@Column(name = "cartprod_id")
@OneToMany(cascade = {CascadeType.ALL})
private List<CartItem> cartProduct;
該物體有一個List<CartItem>如下所示的欄位:
@Entity
@Getter
@Setter
public class CartItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "product_id")
private int productId;
@JsonIgnore
@ManyToOne
private User user;
}
資料庫中它們之間的關系如下圖所示:

上面代碼的想法是有一種方法來保持用戶產品購物車的狀態。
流程如下:
每次用戶在購物車中添加產品時,我都會從前端發出請求,發生這種情況時,我會使用 CartItem 物體將購物車的內容(僅包含產品 ID)保存在資料庫中。
問題
使用這種方法,不是只保存添加到購物車的最后一個產品(或用類似于更新的新值完全替換購物車),而是一遍又一遍地插入相同的物件,但使用所有新的附加值而不是覆寫資料庫中的舊物件(表)。第一個影像就是一個例子。如您所見,我首先將產品添加到購物車中,id 為 327。

接下來,我添加了一個 id 為 328 的產品,但它也第二次添加了 327,這種情況一直持續下去,我添加的產品越多。最后一個代碼片段包含我的控制器代碼。
@PostMapping("/savecart")
public ResponseEntity<String> saveCartToDb(@RequestBody List<CartItem> cartItemList, Principal principal){
System.out.println(cartItemList);
User logedInUser = userService.findUserByUsername(principal.getName()).get();
List<CartItem> cartItem = logedInUser.getCartProduct();
if(cartItem.isEmpty()){
logedInUser.setCartProduct(cartItemList);
userService.saveNewUser(logedInUser);
}else {
cartItem = cartItemList;
logedInUser.setCartProduct(cartItem);
userService.saveNewUser(logedInUser);
}
// userService.saveNewUser(logedInUser);
return ResponseEntity.ok().body("ASD");
}
如何覆寫List<CartItems>用戶的內容,以便我不會一次又一次地附加新舊值?SET 是否有幫助,因為它不允許重復?
我也試過這個How do I update an entity using spring-data-jpa? 但我不確定是否需要為此問題創建一個@Query。
uj5u.com熱心網友回復:
我設法使它作業。解決方案如下。
這是一個雙向的一對多/多對一問題。為了能夠從父元素中移除子元素,我們需要將它們與父元素分離(分離)。由于父母和孩子通過外鍵系結在一起,因此必須在兩端進行分離。如果一個有對另一個的參考,這將不起作用,因此必須洗掉 BOTH REFERENCES。需要2個方法,并且在進行解耦時都需要呼叫。這是我用的。
private Set<CartProduct> cartProduct;
這個要添加到父類(用戶)中。
public void removeChild(CartProduct child) {
this.cartProduct.remove(child);
}
這個要添加到 Child 類中
public void removeParent() {
this.user.removeChild(this);
this.user = null;
}
方法也必須像這樣呼叫
for(CartProduct cartItem : cartItemList){
cartItem.removeParent();
logedInUser.removeChild(cartItem);
}
樂
通過上述實作,您可能會得到一個
java.util.ConcurrentModificationException: null
在其中一種情況下也發生在我身上。為了解決這個問題,我使用了如下所示的迭代器。
for (Iterator<CartProduct> iterator = cartItemList.iterator(); iterator.hasNext();) {
CartProduct cartItem = iterator.next();
if (cartItem != null) {
iterator.remove();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/521160.html
上一篇:如何從目標端加入單向物體?
