JPA manyToMany 关系中间 table 未更新
JPA manyToMany relationship middle table is not updated
我有 CATEGORY、AD 和 CATEGORY_AD table,典型的多对多关系。 CATEGORY_AD table 中没有插入任何内容。我错过了什么?
在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;
在我的服务中class:
Category laCat = new Category();
laCat.setId(categoryId);
laCat.getAds().add(ad);
ad.getCategories().add(laCat);
ad = adRepository.saveAndFlush(ad);
也尝试保存类别对象(在调用 ad.getCategories().add(laCat);
之前)
Please use hibernate @Cascade
annotations on 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
您正在保存 'owned' 边而不是 'owning' 边。
每个多对多关系都必须有一个所有者,在您的例子中是类别。您可以看到,因为在类别中,您在广告 List
中定义了 @JoinTable
,而在广告中,您通过 @ManyToMany(mappedBy = "ads")
.
引用该列表
每当您保存关系的拥有方时,这也会触发对连接 table 的保存,但反之则不然。因此,保存拥有方 (Ad) 将不会对 CATEGORY_AD
table.
执行任何操作
你应该这样做:
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);
您可以看到,即使对类别的保存触发了对连接的保存 table,我们仍然有责任手动将类别添加到广告对象中的类别 List
,因此双方是同步的,具有相同的元素。而且不需要保存广告对象。
我有 CATEGORY、AD 和 CATEGORY_AD table,典型的多对多关系。 CATEGORY_AD table 中没有插入任何内容。我错过了什么?
在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;
在我的服务中class:
Category laCat = new Category();
laCat.setId(categoryId);
laCat.getAds().add(ad);
ad.getCategories().add(laCat);
ad = adRepository.saveAndFlush(ad);
也尝试保存类别对象(在调用 ad.getCategories().add(laCat);
之前)
Please use hibernate
@Cascade
annotations onList<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
您正在保存 'owned' 边而不是 'owning' 边。
每个多对多关系都必须有一个所有者,在您的例子中是类别。您可以看到,因为在类别中,您在广告 List
中定义了 @JoinTable
,而在广告中,您通过 @ManyToMany(mappedBy = "ads")
.
每当您保存关系的拥有方时,这也会触发对连接 table 的保存,但反之则不然。因此,保存拥有方 (Ad) 将不会对 CATEGORY_AD
table.
你应该这样做:
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);
您可以看到,即使对类别的保存触发了对连接的保存 table,我们仍然有责任手动将类别添加到广告对象中的类别 List
,因此双方是同步的,具有相同的元素。而且不需要保存广告对象。