
설계 미스로 playlist 엔티티와 music 엔티티간 관계가 N:1로 설정되어 있었고,
원하는 실제 동작은 플레이리스트는 N개의 음악을 가지고, 음악 또한 M개의 플레이리스트를 가질 수 있도록 하는 것이기에 설계를 변경해야함
다대다 매핑
@Entity
public class Playlist {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "playlist_id")
private Long id;
@ManyToMany
@JoinTable(name = "playlist_music")
private List<Music> musicList = new ArrayList<>();
}
@ManyToMany 어노테이션 사용 시 @JoinTable 어노테이션을 활용해
중간 테이블을 Hibernate가 생성해주지만, 중간 테이블에 PK, FK만 매핑해주기에
추후에 키 이외의 필요한 정보를 컬럼으로 넣어주고자 할 때 문제가 발생
직접 중간 테이블 엔티티 생성하여 매핑
1:N, N:1 관계로 분리한 엔티티를 만들고, 이를 사용하여 매핑
playlist(1) - playlist_music(N) - music(1)
이 후 스펙이 변경될 것을 고려하여 2번을 선택
아래와 같은 구조로 ER-Diagram을 변경

#Playlist entity
@EntityListeners(AuditingEntityListener.class)
@Entity
public class Playlist {
...
@OneToMany(mappedBy = "playlist")
private List<Music> musicList = new ArrayList<Music>();
...
}
@Entity
#중간 테이블
public class PlaylistMusic {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "playlist_music_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "playlist_id")
private Playlist playlist;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "music_id")
private Music music;
}
설정한대로 playlist(1) - playlist_music(N) - music(1) 이 되도록 함