【发布时间】:2021-02-21 04:04:13
【问题描述】:
我在更新记录时遇到了多对多映射问题
我有两个名为 Pack 和 Channels 的表,Pack 可能有许多频道,并且频道可以分配给许多包。当我创建包时,我附加了频道,它可以正常工作,但是当我更新一个包上的频道时,所有其他包也会影响删除的分配频道。
添加 2 个 ID 为 3,7 的包后,这里是多对多表
然后在更新包 id 3 之后
更新一个包,然后所有其他包相关的频道将被删除
Pack Class
@ManyToMany(cascade = {CascadeType.MERGE})
@JoinTable(name = "PacksChannels",
joinColumns = @JoinColumn(name = "pack_id", referencedColumnName = "packId"),
inverseJoinColumns = @JoinColumn(name = "channel_id", referencedColumnName = "channelId"),
uniqueConstraints = {@UniqueConstraint(columnNames = {"pack_id", "channel_id"})})
List<Channel> channels;
频道类
@ManyToMany(cascade = {CascadeType.MERGE})
@JoinTable(name = "PacksChannels",
joinColumns = @JoinColumn(name = "channel_id", referencedColumnName = "channelId"),
inverseJoinColumns = @JoinColumn(name = "pack_id", referencedColumnName = "packId"),
uniqueConstraints = {@UniqueConstraint(columnNames = {"pack_id", "channel_id"})})
@JsonIgnore
List<Pack> packs;
创建包
@Override
public Pack save(Pack pack) {
Pack savePack = packRepository.save(pack);
return savePack;
}
服务层上的更新包
@Override
public Pack update(Pack pack, String ref) {
//I've method call find pack by ref and I get the pack according to ref user pass and then update the pack.
Pack newPack = packRepository.findPackByRef(ref).get();
newPack.setPackName(pack.getPackName());
newPack.setChannels(pack.getChannels());
Pack savedPack = packRepository.save(newPack);
return savedPack;
}
方式添加频道
Sample Pack Json 传递给更新包方法
{
"packId": 3,
"packName": "Test1",
"ref": "1604905979484.55",
"channels": [
{
"channelId": 1,
"name": "test"
},
{
"channelId": 2,
"name": "hShenid"
},
{
"channelId": 3,
"name": "Genesis"
}
]
}
【问题讨论】:
-
那么执行创建和更新的代码在哪里?我们猜猜?
-
@Smutje 我已经添加了那个代码部分
-
更新包时,
pack.getChannels()中的频道是否包含对另一个pack的引用?还有,pack是从哪里来的? -
@Smutje 我添加了包 json 对象
标签: spring-boot hibernate jpa spring-data-jpa