top*_*an5 0 java spring jpa spring-data-jpa
我有 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;
Run Code Online (Sandbox Code Playgroud)
在 Ad.java 中:
@ManyToMany(mappedBy = "ads")
private List<Category> categories;
Run Code Online (Sandbox Code Playgroud)
在我的服务类中:
Category laCat = new Category();
laCat.setId(categoryId);
laCat.getAds().add(ad);
ad.getCategories().add(laCat);
ad = adRepository.saveAndFlush(ad);
Run Code Online (Sandbox Code Playgroud)
您正在保存“拥有”的一面而不是“拥有”的一面。
每个多对多关系都必须有一个所有者,在您的情况下是类别。您可以看到,因为在 Category 中,您@JoinTable在广告中有 的定义List,而在 Ad 中,您引用了该列表@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);
Run Code Online (Sandbox Code Playgroud)
您可以看到,即使对 Category 的保存触发了对连接表的保存,我们仍然有责任手动将类别添加到List广告对象中的类别,以便双方同步,具有相同的元素。并且不需要已经保存广告对象。
| 归档时间: |
|
| 查看次数: |
2297 次 |
| 最近记录: |