2015-11-13 86 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