Spring Boot多对多关联表如何配置unique唯一约束避免重复数据
问题根源
你目前的配置存在两个核心错误:
@Column(unique = true)仅适用于实体类对应的单值数据库字段,完全无法作用于多对多关联的集合类型字段,加在这里没有任何效果- 重复关联数据是存储在多对多的中间表
player_game中,你需要的是中间表的game_id和player_id字段联合唯一,而不是实体表的字段唯一
正确配置方案
1. 修正Game类的多对多注解配置
删掉listOfPlayers字段上无效的@Column(unique = true),在@JoinTable注解中新增联合唯一约束配置,修改后的代码如下:
@ManyToMany @JoinTable( name = "player_game", joinColumns = @JoinColumn(name = "game_id"), inverseJoinColumns = @JoinColumn(name = "player_id"), // 配置中间表联合唯一约束,保证同一个游戏不会重复关联同一个玩家 uniqueConstraints = @UniqueConstraint(columnNames = {"game_id", "player_id"}) ) private List<Player> listOfPlayers;
配置完成后如果是自动生成表结构(比如Hibernate的ddl-auto设为update/create),会自动在player_game表上生成联合唯一索引,手动建表的话需要自行添加该联合唯一约束。
2. 业务层提前校验(可选但推荐)
如果希望不需要请求数据库就能提前拦截重复添加的请求,可以在addPlayersToGame方法中增加存在性判断:
public void addPlayersToGame(Player player) { // 注意Player类需要正确重写equals和hashCode方法,基于主键判断相等即可 if (listOfPlayers.contains(player)) { throw new RuntimeException("该玩家已加入当前游戏"); } listOfPlayers.add(player); }
配置完成后,插入重复关联数据时会触发唯一约束 violation 异常,不会再写入重复数据。
内容的提问来源于stack exchange,提问作者craftdeer
相关产品推荐
相关产品推荐

