休眠-多对多实现

时间:2019-06-30 08:48:20

标签: java spring hibernate

我有3个表,播放列表,歌曲和播放列表_歌曲。 Playlist_Song具有playlist_id外键和user_id外键。我需要获取特定播放列表中的歌曲列表,因此我想对Playlist_Song进行数据库调用,以返回所有带有playlist_id的条目。

然后,我使用歌曲ID对歌曲表进行数据库调用,以检索这些歌曲。我觉得这是非常低效的,应该有更好的方法,但是我真的不知道该怎么做。有什么建议吗?

  public List<Song> getSongsInPlaylist(final int playlistId) {

  final List<PlaylistSong> playlistSongs = playlistSongDao.getPlaylistSong(playlistId);

  if (!playlistSongs.isEmpty()) {
     final List<Song> songs = new ArrayList<>();
     for (PlaylistSong existingPlaylistSong : playlistSongs) {
        songs.add(songDao.findById(existingPlaylistSong.getSongId()).get());
     }

     return songs;
  }

2 个答案:

答案 0 :(得分:0)

作为歌曲ID的列表传递到songDao,并在一个查询中作为列表进行检索。 songDao.findByIdIn(列出songIds)。

答案 1 :(得分:0)

对于这种简单的实现,不需要使用dao和访问联接表。如果您这样定义模型,则应该能够使用在播放列表模型上定义的简单getSongs()方法访问播放列表中的歌曲。

歌曲模型:

val observer = mock<Observer<Int>>()

播放列表模型:

@Entity
@Data
public class Song {
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column (name = "title")
    private String title;

    // some other properties...

    @ManyToMany (mappedBy = "songs")
    private List<Playlist> playlists = new ArrayList<>();
}

要仅使用Hibernate来获取特定的播放列表(尽管使用Spring存储库更容易),则可以使用Session对象来获取它。

@Entity
@Data
public class Playlist {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "name")
    private String name;

    // some other properties...

    @ManyToMany (cascade = CascadeType.ALL)
    @JoinTable (
            name = "Playlist_Song",
            joinColumns = { @JoinColumn (name = "playlist_id") },
            inverseJoinColumns = { @JoinColumn (name = "song_id") }
    )
    private List<Song> songs = new ArrayList<>();
}