Java JPA多人关系中间表未更新
我有分类、广告和分类广告表,典型的多对多关系。不知何故,在CATEGORY_AD表中没有插入任何内容。我错过了什么 在Category.java中:Java JPA多人关系中间表未更新,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,我有分类、广告和分类广告表,典型的多对多关系。不知何故,在CATEGORY_AD表中没有插入任何内容。我错过了什么 在Category.java中: @ManyToMany @JoinTable(name = "CATEGORY_AD", joinColumns = { @JoinColumn(name = "CATEGORY_ID", referencedColumnName = "ID") }, inverseJoinColumns = { @
@ManyToMany
@JoinTable(name = "CATEGORY_AD", joinColumns = {
@JoinColumn(name = "CATEGORY_ID", referencedColumnName = "ID") }, inverseJoinColumns = {
@JoinColumn(name = "AD_ID", referencedColumnName = "ID") })
private List<Ad> ads;
同时尝试保存类别对象(在调用
ad.getCategories().add(laCat);
)同时尝试保存类别对象(在调用ad.getCategories().add(laCat);
)
请使用hibernate@Cascade
注释查看列表类别
import org.hibernate.annotations.Cascade;
导入org.hibernate.annotations.CascadeType;
@许多(mappedBy=“ads”)
@级联(值=级联类型。保存\更新)
私人名单类别;
如果您喜欢使用JPA注释,则可以尝试以下方法:
@ManyToMany(mappedBy = "ads", cascade = CascadeType.PERSIST)
@Cascade(value = CascadeType.SAVE_UPDATE)
private List<Category> categories;
@ManyToMany(mappedBy=“ads”,cascade=CascadeType.PERSIST)
@级联(值=级联类型。保存\更新)
私人名单类别;
请检查此线程:
请使用hibernate@Cascade
注释查看列表类别
import org.hibernate.annotations.Cascade;
导入org.hibernate.annotations.CascadeType;
@许多(mappedBy=“ads”)
@级联(值=级联类型。保存\更新)
私人名单类别;
如果您喜欢使用JPA注释,则可以尝试以下方法:
@ManyToMany(mappedBy = "ads", cascade = CascadeType.PERSIST)
@Cascade(value = CascadeType.SAVE_UPDATE)
private List<Category> categories;
@ManyToMany(mappedBy=“ads”,cascade=CascadeType.PERSIST)
@级联(值=级联类型。保存\更新)
私人名单类别;
请检查此线程:您正在保存“拥有”端,而不是“拥有”端 每个多人关系都必须有一个所有者,在您的情况下,这就是类别。您可以看到这一点,因为在类别中,您在ads
列表中定义了@JoinTable
,而在Ad中,您通过@manytomy(mappedBy=“ads”)
引用该列表
每当保存关系的拥有方时,这也会触发对联接表的保存,但不会反过来。因此,在CATEGORY\u Ad
表中,保存所属方(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);
您可以看到,即使类别上的保存触发了联接表上的保存,我们仍有责任手动将类别添加到ad对象中的categories列表中,这样双方都是同步的,具有相同的元素。而且不需要保存广告对象。您正在保存的是“拥有”端,而不是“拥有”端
每个多人关系都必须有一个所有者,在您的情况下,这就是类别。您可以看到这一点,因为在类别中,您在ads列表中定义了@JoinTable
,而在Ad中,您通过@manytomy(mappedBy=“ads”)
引用该列表
每当保存关系的拥有方时,这也会触发对联接表的保存,但不会反过来。因此,在CATEGORY\u Ad
表中,保存所属方(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);
您可以看到,即使类别上的保存触发了联接表上的保存,我们仍有责任手动将类别添加到ad对象中的categories列表中,这样双方都是同步的,具有相同的元素。无需保存广告对象。您的服务是否已发布@Transactional注释?请检查我发布的答案,如果它解决了问题,请接受。您的服务是否已发布@Transactional注释?请检查我发布的答案,如果它解决了问题,请接受。
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);