feat(music): 支持音乐关联多个歌手

- 修改 Music 和 Singer 实体,使用 @ManyToMany 注解实现多对多关联- 在 MusicServiceImpl 中实现歌手名称字符串的分割和处理
- 删除 singer_music 表,改为在代码中处理关联关系
This commit is contained in:
ikmkj
2025-07-26 22:23:05 +08:00
parent 35db37ca12
commit a1e5294fdd
4 changed files with 37 additions and 54 deletions

View File

@@ -91,7 +91,12 @@ public class Music {
/** /**
* 歌手列表 * 歌手列表
*/ */
@ManyToMany(mappedBy = "musics") @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(
name = "music_singer",
joinColumns = @JoinColumn(name = "music_id"),
inverseJoinColumns = @JoinColumn(name = "singer_id")
)
private Set<Singer> singers = new HashSet<>(); private Set<Singer> singers = new HashSet<>();
/** /**

View File

@@ -77,12 +77,7 @@ public class Singer {
/** /**
* 歌手关联的音乐 * 歌手关联的音乐
*/ */
@ManyToMany @ManyToMany(mappedBy = "singers")
@JoinTable(
name = "singer_music",
joinColumns = @JoinColumn(name = "singer_id"),
inverseJoinColumns = @JoinColumn(name = "music_id")
)
private Set<Music> musics = new HashSet<>(); private Set<Music> musics = new HashSet<>();
/** /**

View File

@@ -329,25 +329,22 @@ public class MusicServiceImpl implements MusicService {
music.setSingers(singers); music.setSingers(singers);
} else if (StringUtils.hasText(musicDTO.getSinger())) { } else if (StringUtils.hasText(musicDTO.getSinger())) {
// 如果有歌手名称字符串,则处理歌手名称 // 如果有歌手名称字符串,则处理歌手名称
String singerName = musicDTO.getSinger(); String[] singerNames = musicDTO.getSinger().split("[,,、]");
// 查找是否已存在该歌手 Set<Singer> singers = new HashSet<>();
Optional<Singer> existingSinger = singerRepository.findByName(singerName); for (String singerName : singerNames) {
String trimmedName = singerName.trim();
if (existingSinger.isPresent()) { if (StringUtils.hasText(trimmedName)) {
// 如果歌手已存在,直接使用 Optional<Singer> existingSinger = singerRepository.findByName(trimmedName);
Set<Singer> singers = new HashSet<>(); if (existingSinger.isPresent()) {
singers.add(existingSinger.get()); singers.add(existingSinger.get());
music.setSingers(singers); } else {
} else { Singer newSinger = new Singer();
// 如果歌手不存在,创建新歌手 newSinger.setName(trimmedName);
Singer newSinger = new Singer(); singers.add(singerRepository.save(newSinger));
newSinger.setName(singerName); }
Singer savedSinger = singerRepository.save(newSinger); }
Set<Singer> singers = new HashSet<>();
singers.add(savedSinger);
music.setSingers(singers);
} }
music.setSingers(singers);
} }
// 保存音乐 // 保存音乐
@@ -428,25 +425,22 @@ public class MusicServiceImpl implements MusicService {
music.setSingers(singers); music.setSingers(singers);
} else if (StringUtils.hasText(musicDTO.getSinger())) { } else if (StringUtils.hasText(musicDTO.getSinger())) {
// 如果有歌手名称字符串,则处理歌手名称 // 如果有歌手名称字符串,则处理歌手名称
String singerName = musicDTO.getSinger(); String[] singerNames = musicDTO.getSinger().split("[,,、]");
// 查找是否已存在该歌手 Set<Singer> singers = new HashSet<>();
Optional<Singer> existingSinger = singerRepository.findByName(singerName); for (String singerName : singerNames) {
String trimmedName = singerName.trim();
if (existingSinger.isPresent()) { if (StringUtils.hasText(trimmedName)) {
// 如果歌手已存在,直接使用 Optional<Singer> existingSinger = singerRepository.findByName(trimmedName);
Set<Singer> singers = new HashSet<>(); if (existingSinger.isPresent()) {
singers.add(existingSinger.get()); singers.add(existingSinger.get());
music.setSingers(singers); } else {
} else { Singer newSinger = new Singer();
// 如果歌手不存在,创建新歌手 newSinger.setName(trimmedName);
Singer newSinger = new Singer(); singers.add(singerRepository.save(newSinger));
newSinger.setName(singerName); }
Singer savedSinger = singerRepository.save(newSinger); }
Set<Singer> singers = new HashSet<>();
singers.add(savedSinger);
music.setSingers(singers);
} }
music.setSingers(singers);
} }
// 保存音乐 // 保存音乐

View File

@@ -202,17 +202,6 @@ CREATE TABLE `singer` (
INDEX `idx_type_id`(`type_id` ASC) USING BTREE INDEX `idx_type_id`(`type_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '歌手表' ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '歌手表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for singer_music
-- ----------------------------
DROP TABLE IF EXISTS `singer_music`;
CREATE TABLE `singer_music` (
`singer_id` bigint NOT NULL,
`music_id` bigint NOT NULL,
PRIMARY KEY (`singer_id`, `music_id`) USING BTREE,
INDEX `FKk0fdv208e2ulhcxd9gge63h6j`(`music_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Table structure for singer_type -- Table structure for singer_type
-- ---------------------------- -- ----------------------------