2015-11-13 121 views
0

我有CATEGORY,AD和CATEGORY_AD表,典型的多對多關係。不知何故,CATEGORY_AD表中沒有插入任何內容。我錯過了什麼?JPA manyToMany關係中間表未更新

在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); 
+0

有你的服務@Transactional註釋? –

+0

請檢查我發佈的答案,如果它解決了問題,請接受。 – SyntaX

回答

4

要保存,而不是 '擁有' 側「擁有'一方。

每個ManyToMany關係都必須有一個所有者,在您的情況下是Category。您可以看到,因爲在類別中,您在廣告List中定義了@JoinTable,在廣告中,您通過@ManyToMany(mappedBy = "ads")參考了該列表。

每當您保存關係的擁有方時,這也會觸發連接表上的保存,但不會以其他方式進行。因此,保存擁有方(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廣告對象,因此雙方同步,具有相同的元素。並且不需要保存廣告對象。

0

嘗試保存類別對象也(你調用之前ad.getCategories().add(laCat);

0

請使用hibernate @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