You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

购物车删除商品失效问题求助(附代码)

问题分析与解决方案

问题根源

核心问题是Fiction实体没正确重写equals()和hashCode()方法。

你从数据库用fictionRepo.findById(id)查出来的Fiction实例,和之前添加到购物车的Fiction实例是两个不同的对象。Java默认的equals()是比内存地址,所以item.equals(fiction)会返回false,导致iterator.remove()根本没执行,商品留在购物车里;但totale = totale - fiction.getPrezzo()不受这个判断影响,所以总价会被正常扣除,就出现了现在的矛盾现象。

解决方案

给Fiction实体重写equals()和hashCode(),基于主键id(唯一标识)来判断对象是否相等:

@Entity
public class Fiction {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // 其他字段、getter、setter方法

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Fiction fiction = (Fiction) o;
        return Objects.equals(id, fiction.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

额外优化建议

可以给Cart的remove方法加个判断,只有真删除了商品才扣总价,避免总价出错:

public void remove(Fiction fiction) {
    Iterator<Fiction> iterator = fictions.iterator();
    boolean isRemoved = false;
    while(iterator.hasNext()) {
        Fiction item = iterator.next();
        if(item.equals(fiction)) {
            iterator.remove();
            isRemoved = true;
            break; // 找到匹配项就退出循环,不用继续遍历
        }
    }
    if(isRemoved) {
        this.totale = totale - fiction.getPrezzo();
    }
}

内容的提问来源于stack exchange,提问作者Claudio Nugnes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:42:10