【问题标题】:How to update a collection field in entity using Spring Data JPA?如何使用 Spring Data JPA 更新实体中的集合字段?
【发布时间】: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


    【解决方案1】:

    我拿到包的方式真的很糟糕,我什至不会给你看)

    有什么帮助:将所有存储库逻辑从控制器转移到服务,并用@transactional 注释标记它!

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 2015-05-25
      相关资源
      最近更新 更多