JPA manyToMany 关系中间 table 未更新

JPA manyToMany relationship middle table is not updated

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

在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;

在我的服务中class:

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

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

也尝试保存类别对象(在调用 ad.getCategories().add(laCat); 之前)

Please use hibernate @Cascade annotations on List<Category> categories;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

 @ManyToMany(mappedBy = "ads")
 @Cascade(value = CascadeType.SAVE_UPDATE)
 private List<Category> categories;

如果您更喜欢使用 JPA 注释,那么您可以试试这个:

 @ManyToMany(mappedBy = "ads", cascade = CascadeType.PERSIST)
 @Cascade(value = CascadeType.SAVE_UPDATE)
 private List<Category> categories;

请检查此线程:what is cascading in hibernate

您正在保存 'owned' 边而不是 'owning' 边。

每个多对多关系都必须有一个所有者,在您的例子中是类别。您可以看到,因为在类别中,您在广告 List 中定义了 @JoinTable,而在广告中,您通过 @ManyToMany(mappedBy = "ads").

引用该列表

每当您保存关系的拥有方时,这也会触发对连接 table 的保存,但反之则不然。因此,保存拥有方 (Ad) 将不会对 CATEGORY_ADtable.

执行任何操作

你应该这样做:

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);

您可以看到,即使对类别的保存触发了对连接的保存 table,我们仍然有责任手动将类别添加到广告对象中的类别 List,因此双方是同步的,具有相同的元素。而且不需要保存广告对象。