JPA多对多映射更新问题



我在更新记录时遇到了多对多映射问题

我有两个表,叫做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;

最新更新