假設我有兩個實體,它們的字段之間有 @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<>();我有一個控制器,我想在其中將新的 Card實體添加到Pack實體中的集合中,然后我想將其全部保存到我的數(shù)據(jù)庫中,當然還有關系。@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"; } }看起來每次我嘗試調(diào)用packRepo.save(pack)方法時,它都會獲取 Pack 實體中的所有 Card 實體并將它們作為新實體保存到數(shù)據(jù)庫中,即使其中一些已經(jīng)存在于我的數(shù)據(jù)庫中. 我希望它檢查 Pack 實體是否有一組卡片實體,它應該檢查數(shù)據(jù)庫中是否已經(jīng)存在具有此類 ID 的每張卡片,并且只添加新卡片。我嘗試清除集合,然后只添加我想要保存的新元素,但隨后它只是從數(shù)據(jù)庫中刪除了所有不在當前包狀態(tài)的內(nèi)容并只添加新元素我想要保存 @ManyToMany 相關 Set 的最好方法,這樣它就不會在我的數(shù)據(jù)庫中創(chuàng)建新的重復實例
1 回答

阿晨1998
TA貢獻2037條經(jīng)驗 獲得超6個贊
我拿到包的方式真的很糟糕,我什至不會給你看)
有幫助的是:將所有存儲庫邏輯從控制器移動到服務,并用 @transactional 注釋標記它!
添加回答
舉報
0/150
提交
取消