购物车删除商品失效问题求助(附代码)
问题分析与解决方案
问题根源
核心问题是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
相关产品推荐
相关产品推荐

