package com.vibevault.model; import jakarta.persistence.*; import java.util.ArrayList; import java.util.List; /** * 歌单实体类 * * 需要实现: * - 将此类映射为数据库表 "playlists" * - id 作为自增主键 * - name 不能为空 * - 每个歌单属于一个用户(多对一关系) * - 一个歌单包含多首歌曲(一对多关系) * - 删除歌单时应级联删除其中的歌曲 */ @Entity // 实现:将此类映射为数据库表 @Table(name = "playlists") // 实现:指定表名为"playlists" public class Playlist { @Id // 实现:标记id为主键 @GeneratedValue(strategy = GenerationType.IDENTITY) // 实现:id作为自增主键 private Long id; @Column(nullable = false) // 实现:name不能为空 private String name; // 实现:每个歌单属于一个用户(多对一关系) @ManyToOne(fetch = FetchType.LAZY, optional = false) // 多对一,用户不能为空 @JoinColumn(name = "user_id") // 数据库中关联用户的字段名 private User owner; // 实现:一个歌单包含多首歌曲(一对多关系) + 删除歌单时级联删除歌曲 @OneToMany(mappedBy = "playlist", cascade = CascadeType.ALL, orphanRemoval = true) private List songs = new ArrayList<>(); public Playlist() { } // 带参数的构造方法(方便创建歌单) public Playlist(String name, User owner) { this.name = name; this.owner = owner; } // 维护双向关系:添加歌曲到歌单 public void addSong(Song song) { songs.add(song); song.setPlaylist(this); } // 维护双向关系:从歌单移除歌曲 public void removeSong(Song song) { songs.remove(song); song.setPlaylist(null); } // 必要的getter/setter方法 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User getOwner() { return owner; } public void setOwner(User owner) { this.owner = owner; } public List getSongs() { return songs; } public void setSongs(List songs) { this.songs = songs; } }