我有一個電子商務型別的應用程式 (Spring Boot) 正在進行中,我正在使用 HashMap<Item, Long> 來跟蹤購物車中的專案和專案計數。將商品添加到購物車時,哈希圖無法識別相似商品并創建新條目,而不是添加到商品計數中。我知道這與 Jpa 以及生成哈希碼的方式有某種關系。我嘗試了與 POJOs 相同的情況(沒有 jpa 或任何東西)并且密鑰被識別。我嘗試覆寫如下所示的 equals(Object o) 和 hashCode() 方法(以忽略有問題的串列),但即使它現在生成相同的哈希碼(如下所示)也無濟于事。我會很高興讓這個作業,提前謝謝你!
物品:
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Item extends AbstractPersistable<Long> {
private String name;
private Long productNumber;
private Double price;
private Double discountPrice;
private Double discountFactor;
private Integer stock;
@Column(length = 10000)
private String description;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Image> images = new ArrayList<>();
private Boolean isHidden;
private Boolean isService;
@ManyToOne
private ItemCategory category;
public Item(String name, Double price, String description, int stock, ItemCategory category) {
this.name = name;
this.price = price;
this.description = description;
this.stock = stock;
this.category = category;
}
>>getters and setters<<
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Item item = (Item) o;
if (name != null ? !name.equals(item.name) : item.name != null) {
return false;
}
if (productNumber != null ? !productNumber.equals(item.productNumber) : item.productNumber != null) {
return false;
}
if (discountPrice != null ? !discountPrice.equals(item.discountPrice) : item.discountPrice != null) {
return false;
}
if (discountFactor != null ? !discountFactor.equals(item.discountFactor) : item.discountFactor != null) {
return false;
}
if (stock != null ? !stock.equals(item.stock) : item.stock != null) {
return false;
}
if (description != null ? !description.equals(item.description) : item.description != null) {
return false;
}
if (isHidden != null ? !isHidden.equals(item.isHidden) : item.isHidden != null) {
return false;
}
if (isService != null ? !isService.equals(item.isService) : item.isService != null) {
return false;
}
return category != null ? category.equals(item.category) : item.category == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result (productNumber != null ? productNumber.hashCode() : 0);
result = 31 * result (discountPrice != null ? discountPrice.hashCode() : 0);
result = 31 * result (discountFactor != null ? discountFactor.hashCode() : 0);
result = 31 * result (stock != null ? stock.hashCode() : 0);
result = 31 * result (description != null ? description.hashCode() : 0);
result = 31 * result (isHidden != null ? isHidden.hashCode() : 0);
result = 31 * result (isService != null ? isService.hashCode() : 0);
result = 31 * result (category != null ? category.hashCode() : 0);
return result;
}
圖片:
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Image extends AbstractPersistable<Long> {
@Lob
@Basic(fetch = FetchType.LAZY)
private byte[] content;
@ManyToOne
@JoinColumn(name = "item_id")
private Item item;
private Boolean isMainPicture;
private int ordinal;
}
購物車:
@Component
@AllArgsConstructor
@NoArgsConstructor
@Data
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ShoppingCart {
private Map<Item, Long> items = new HashMap<>();
public void addToCart(Item item) {
Long itemCount = this.items.getOrDefault(item, 0L) 1L;
this.items.put(item, itemCount);
}
public void removeFromCart(Item item) {
if (this.items.get(item) == 1L) {
this.items.remove(item);
return;
}
Long itemCount = this.items.get(item) - 1L;
this.items.put(item, itemCount);
}
public Double getSum() {
return this.items.keySet().stream()
.map(item -> (item.getPrice() * this.items.get(item)))
.reduce(0.0, (currentSum, nextCost) -> currentSum nextCost);
}
}
@Controller 中的 viewCart 方法:
@GetMapping("/cart")
public String viewCart(Model model) {
System.out.println("!!!!!!!!!!!!!!!!!!");
shoppingCart.getItems().keySet().stream().forEach(key -> System.out.println(key.toString() "; hashcode = " key.hashCode()));
model.addAttribute("items", shoppingCart.getItems());
return "cart";
}
在 HashMap 中具有兩個相似項的 viewCart 方法之后的控制臺:
!!!!!!!!!!!!!!!!!!
Entity of type mortar.euroshopper.eCommerceApplication.Item with id: 6; hashcode = 34943583
Entity of type mortar.euroshopper.eCommerceApplication.Item with id: 6; hashcode = 34943583
uj5u.com熱心網友回復:
感謝 M. Deinum 提出的解決問題的評論!在此處找到說明:https : //vladmihalcea.com/the-best-way-to-implement-equals-hashcode-and-tostring-with-jpa-and-hibernate/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/355886.html
