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