我在更新记录时遇到了多对多映射问题
我有两个表,叫做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;
}
Way Add Channels
在此处输入图像描述
样本包Json通过更新包方法
{
"packId": 3,
"packName": "Test1",
"ref": "1604905979484.55",
"channels": [
{
"channelId": 1,
"name": "test"
},
{
"channelId": 2,
"name": "hShenid"
},
{
"channelId": 3,
"name": "Genesis"
}
]
}
删除级联选项后,问题已解决
@ManyToMany()
@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()
@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;