【问题标题】:JPA manyToMany relationship middle table is not updatedJPA manyToMany 关系中间表没有更新
【发布时间】:2015-11-13 23:39:03
【问题描述】:

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

【问题讨论】:

  • 你的服务有@Transactional注解吗?
  • 请检查我发布的答案,如果它解决了问题,请接受。

标签: java spring jpa spring-data-jpa


【解决方案1】:

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

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

每当您保存关系的拥有方时,这也会触发连接表上的保存,但反之则不会。因此,保存拥有方(广告)不会对 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);

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      请在List&lt;Category&gt; categories上使用hibernate @Cascade注解;

      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

      【讨论】:

        猜你喜欢
        • 2021-07-31
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 2016-09-08
        • 1970-01-01
        • 2017-12-12
        • 1970-01-01
        • 2013-09-24
        相关资源
        最近更新 更多