簡體   English   中英

如何使用Spring Data JPA更新實體中的集合字段?

[英]How to update a collection field in entity using Spring Data JPA?

假設我有兩個實體,它們的字段之間有@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<>();

我有一個控制器, 我想在其中添加新的卡實體到實體中的設置,然后我想將它全部保存到我的數據庫中。

@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實體是否有一組卡實體,它應該檢查每個具有這種ID的卡是否已經存在於DB中,並且只添加新的卡。 我嘗試清除集合,然后只添加我想要保存的新元素,但之后它只是從DB中刪除了不在cuurent pack狀態中的所有內容並且只添加了新的元素


我想要最好的方法來保存@ManyToMany相關的Set,這樣它就不會在我的DB中創建一個新的重復實例

我得到的方式非常糟糕,我甚至不會告訴你這個)

有幫助的是 :將所有存儲庫邏輯從控制器移動到服務,並使用@transactional注釋標記它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM