【发布时间】:2019-09-21 03:17:36
【问题描述】:
假设我有两个实体,它们的字段之间有 @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<>();
第二个叫卡片:
@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 实体,并将它们作为一个新的,即使其中一些已经存在于我的数据库中。我希望它检查 Pack 实体是否有一组卡片实体,它应该检查具有此类 ID 的每张卡片是否已经存在于数据库中,并添加只有新的。我尝试清除该集合,然后仅添加我要保存的新元素,但随后它只是从 DB 中删除了所有不在当前包状态的内容并仅添加新元素
我想要最好的方法来保存 @ManyToMany 相关的 Set,这样它就不会在我的数据库中创建新的重复实例
【问题讨论】:
标签: java hibernate spring-boot spring-data-jpa many-to-many