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

时间:2019-05-02 14:58:52

标签: java hibernate spring-boot spring-data-jpa many-to-many

比方说,我有两个实体,它们的字段之间具有@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的每张纸牌,并添加只有新的。我尝试清除集合,然后仅添加要保存的新元素,但随后它只是从数据库中删除了所有不在当前打包状态的元素,而仅添加了新元素


我想要保存与@ManyToMany相关的Set的最好方法,这样它就不会在我的数据库中创建新的重复实例

1 个答案:

答案 0 :(得分:0)

我拿到包装的方式真的很糟糕,我什至不会告诉你)

有帮助的是:将所有存储库逻辑从控制器转移到服务,并使用@transactional批注对其进行标记!