Как обновить поле коллекции в сущности, используя Spring Data JPA? - PullRequest
0 голосов
/ 02 мая 2019

Допустим, у меня есть две сущности с отношением @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<>();

У меня есть контроллер, в котором я хочу добавить новую сущность 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) метод, он берет все сущности Card, находящиеся в сущности Pack, и сохраняет их все в БД как новый те, даже если некоторые из них уже существуют в моей БД. Я хочу, чтобы он проверил, есть ли у сущности Pack набор сущностей карточек, он должен проверить, существует ли каждая карточка с такими идентификаторами в БД, и добавить только новые из них. Я попытался очистить набор и затем добавить только новые элементы, которые я хочу сохранить, но затем он просто удалил из БД все, что не было в состоянии пакета cuurent, и добавил только новые


Я хочу, чтобы самый лучший способ сохранить набор, связанный с @ManyToMany, чтобы он не создавал новые дубликаты в моей БД

1 Ответ

0 голосов
/ 08 мая 2019

То, как я получил пакет, было действительно плохо, я даже не покажу вам это)

Что помогло, так это : переместил всю логику хранилища с контроллеров на службы и пометил еес аннотацией @transactional!

...