gpt4 book ai didi

java - JPA多对多关系中间表不更新

转载 作者:行者123 更新时间:2023-12-01 18:10:05 25 4
gpt4 key购买 nike

我有 CATEGORY、AD 和 CATEGORY_AD 表,典型的多对多关系。不知何故,没有任何内容插入到 CATEGORY_AD 表中。我错过了什么?

在 Category.java 中:

@ManyToMany
@JoinTable(name = "CATEGORY_AD", joinColumns = {
@JoinColumn(name = "CATEGORY_ID", referencedColumnName = "ID") }, inverseJoinColumns = {
@JoinColumn(name = "AD_ID", referencedColumnName = "ID") })
private List<Ad> ads;

在 Ad.java 中:

@ManyToMany(mappedBy = "ads")
private List<Category> categories;

在我的服务类中:

        Category laCat = new Category();
laCat.setId(categoryId);
laCat.getAds().add(ad);

ad.getCategories().add(laCat);
ad = adRepository.saveAndFlush(ad);

最佳答案

您正在保存“拥有”方而不是“拥有”方。

每个多对多关系都必须有一个所有者,在您的例子中是类别。您可以看到,因为在 Category 中,您在广告 List 中定义了 @JoinTable,而在 Ad 中,您通过 @ManyToMany(mappedBy) 引用该列表=“广告”)

每当您保存关系的拥有方时,这也会触发连接表上的保存,但反之则不然。因此,保存拥有的一方 (Ad) 不会对 CATEGORY_AD 表执行任何操作。

你应该这样做:

Category laCat = new Category();
laCat.setId(categoryId);
laCat.getAds().add(ad);
// Next line will insert on CATEGORY and CATEGORY_AD tables
laCat = categoryRepository.saveAndFlush(category);

// We add the category to the ad object to keep both sides in sync
ad.getCategories().add(laCat);

您可以看到,即使对类别的保存会触发对连接表的保存,我们仍然有责任手动将类别添加到广告对象中的类别List,以便双方保持同步,具有相同的元素。并且无需保存广告对象。

关于java - JPA多对多关系中间表不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33703431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com