Spring Boot-MongoDB:@DBRef HashSet存重复元素且remove方法失效问题
解决MongoDB @DBRef集合重复添加及remove无效问题
你遇到的问题核心原因很明确:HashSet是依靠元素的equals()和hashCode()方法来判断唯一性的,而你的Item实体类大概率没有正确重写这两个方法。
当通过@DBRef关联Item时,即使两个Item对象的数据库ID完全相同,只要没基于ID重写equals()和hashCode(),HashSet就会把它们当成完全不同的元素——这就直接导致了重复元素能被添加,调用remove()时也找不到匹配的元素,自然无法移除。
具体解决方案
1. 给Item类重写equals()和hashCode()方法
基于主键id来实现这两个方法,这是实体类判断同一性的标准做法:
class Item { @Id private String id; // 其他字段、构造方法、getter/setter @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Item item = (Item) o; return Objects.equals(id, item.id); } @Override public int hashCode() { return Objects.hash(id); } }
2. 优化添加元素的代码逻辑
其实不需要重新创建HashSet再调用user.setFavorites(set),直接操作从User实例中获取的集合即可,Spring Data MongoDB会自动跟踪集合的变化:
public void addItem(String username, String id){ Item item = itemService.findById(id); User user = userService.findByUsername(username); user.getFavorites().add(item); this.userRepository.save(user); }
补充说明
HashSet的底层逻辑是先通过hashCode()计算元素的哈希值定位存储位置,再通过equals()确认是否为同一个元素。如果用Object类默认的实现(基于对象内存地址判断),即使是数据库中同一条记录对应的不同对象实例,HashSet也会认为是不同元素,这就是你遇到问题的本质。
内容的提问来源于stack exchange,提问作者Blank
相关产品推荐
相关产品推荐

