Java JPA多人关系中间表未更新

Java JPA多人关系中间表未更新,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,我有分类、广告和分类广告表,典型的多对多关系。不知何故,在CATEGORY_AD表中没有插入任何内容。我错过了什么 在Category.java中: @ManyToMany @JoinTable(name = "CATEGORY_AD", joinColumns = { @JoinColumn(name = "CATEGORY_ID", referencedColumnName = "ID") }, inverseJoinColumns = { @

我有分类、广告和分类广告表,典型的多对多关系。不知何故,在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.getCategories().add(laCat);

同时尝试保存类别对象(在调用
ad.getCategories().add(laCat);

请使用hibernate
@Cascade
注释查看
列表类别

import org.hibernate.annotations.Cascade;
导入org.hibernate.annotations.CascadeType;
@许多(mappedBy=“ads”)
@级联(值=级联类型。保存\更新)
私人名单类别;
如果您喜欢使用JPA注释,则可以尝试以下方法:

 @ManyToMany(mappedBy = "ads", cascade = CascadeType.PERSIST)
 @Cascade(value = CascadeType.SAVE_UPDATE)
 private List<Category> categories;
@ManyToMany(mappedBy=“ads”,cascade=CascadeType.PERSIST)
@级联(值=级联类型。保存\更新)
私人名单类别;
请检查此线程:

请使用hibernate
@Cascade
注释查看
列表类别

import org.hibernate.annotations.Cascade;
导入org.hibernate.annotations.CascadeType;
@许多(mappedBy=“ads”)
@级联(值=级联类型。保存\更新)
私人名单类别;
如果您喜欢使用JPA注释,则可以尝试以下方法:

 @ManyToMany(mappedBy = "ads", cascade = CascadeType.PERSIST)
 @Cascade(value = CascadeType.SAVE_UPDATE)
 private List<Category> categories;
@ManyToMany(mappedBy=“ads”,cascade=CascadeType.PERSIST)
@级联(值=级联类型。保存\更新)
私人名单类别;

请检查此线程:

您正在保存“拥有”端,而不是“拥有”端

每个多人关系都必须有一个所有者,在您的情况下,这就是类别。您可以看到这一点,因为在类别中,您在ads
列表中定义了
@JoinTable
,而在Ad中,您通过
@manytomy(mappedBy=“ads”)
引用该列表

每当保存关系的拥有方时,这也会触发对联接表的保存,但不会反过来。因此,在
CATEGORY\u Ad
表中,保存所属方(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);

您可以看到,即使类别上的保存触发了联接表上的保存,我们仍有责任手动将类别添加到ad对象中的categories
列表中,这样双方都是同步的,具有相同的元素。而且不需要保存广告对象。

您正在保存的是“拥有”端,而不是“拥有”端

每个多人关系都必须有一个所有者,在您的情况下,这就是类别。您可以看到这一点,因为在类别中,您在ads
列表中定义了
@JoinTable
,而在Ad中,您通过
@manytomy(mappedBy=“ads”)
引用该列表

每当保存关系的拥有方时,这也会触发对联接表的保存,但不会反过来。因此,在
CATEGORY\u Ad
表中,保存所属方(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);

您可以看到,即使类别上的保存触发了联接表上的保存,我们仍有责任手动将类别添加到ad对象中的categories
列表中,这样双方都是同步的,具有相同的元素。无需保存广告对象。

您的服务是否已发布@Transactional注释?请检查我发布的答案,如果它解决了问题,请接受。您的服务是否已发布@Transactional注释?请检查我发布的答案,如果它解决了问题,请接受。
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);