JPA manyToMany关系中间表未更新

时间:2015-11-13 23:39:04

标签: java spring jpa spring-data-jpa

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

3 个答案:

答案 0 :(得分:4)

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

每个ManyToMany关系必须拥有一个所有者,在您的情况下是所有者。您可以看到,因为在类别中,您在广告Language & Frameworks -> Javascript -> Libraries中定义了@JoinTable,而在广告中,您可以通过List引用该列表。

每当你保存关系的拥有方时,这也会触发连接表上的保存,但不是相反。因此,保存所有者(广告)将不会对@ManyToMany(mappedBy = "ads")表格执行任何操作。

你应该这样做:

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); ,以便双方同步,拥有相同的元素。而且无需保存广告对象。

答案 1 :(得分:0)

尝试保存Category对象(在调用{{1}}之前)

答案 2 :(得分:0)

  

请在@Cascade;

上使用休眠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