比方说,我有两个实体,它们的字段之间具有@ManyToMany关系。 第一个实体称为 Pack :
@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@JoinTable(name = "card_in_pack",
joinColumns = {@JoinColumn(name = "pack_id")},
inverseJoinColumns = {@JoinColumn(name = "card_id")})
private Set<Card> cards = new HashSet<>();
第二个叫 Card :
@ManyToMany(mappedBy = "cards")
private Set<Pack> packs = new HashSet<>();
我有一个控制器,在其中我要将 new Card 实体添加到 Pack 实体中的集合中,然后将其全部保存到我的数据库有关系。
@PostMapping("/packs/{namePack}")
public String addCard(@Valid Card card, @PathVariable String namePack, @AuthenticationPrincipal User user) {
//Assume I got a Pack instance with name pack
card.setAuthor(user);
pack.addCard(card);
packRepo.save(pack);
return "pack";
}
}
就像每次我尝试调用 packRepo.save(pack)方法一样,它将获取Pack实体中的所有Card实体,并将它们全部保存为DB新的,即使其中一些已经存在于我的数据库中。我希望它检查Pack实体是否具有一组纸牌实体,它应检查DB中是否已存在具有这种ID的每张纸牌,并添加只有新的。我尝试清除集合,然后仅添加要保存的新元素,但随后它只是从数据库中删除了所有不在当前打包状态的元素,而仅添加了新元素
答案 0 :(得分:0)
我拿到包装的方式真的很糟糕,我什至不会告诉你)
有帮助的是:将所有存储库逻辑从控制器转移到服务,并使用@transactional批注对其进行标记!