Hibernate - реализация "многие ко многим" - PullRequest
0 голосов
/ 30 июня 2019

У меня есть 3 таблицы, Playlist, Song и Playlist_Song.Playlist_Song имеет внешний ключ playlist_id и внешний ключ user_id.Мне нужно получить список песен в определенном списке воспроизведения, поэтому я подумал сделать вызов базы данных для Playlist_Song, который возвращает все записи с playlist_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 голосов
/ 30 июня 2019

Нет необходимости использовать dao и обращаться к таблице соединений для таких простых реализаций. Если вы определите свои модели таким образом, вы сможете получить доступ к песням в списке воспроизведения с помощью простого метода getSongs (), определенного в модели списка воспроизведения.

Модель песни:

@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<>();
}

Модель списка воспроизведения:

@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<>();
}

А чтобы получить определенный список воспроизведения, используя только Hibernate (хотя это проще сделать в репозиториях Spring, если вы их используете), вы можете получить его с помощью объекта Session.

public Playlist getPlaylistById(Integer id) {
    Playlist playlist = null;

    try (Session session = HibernateUtil.getSessionFactory().openSession()){
        playlist = (Playlist) session.get(Playlist.class, id);
    }

    return playlist;
}
0 голосов
/ 30 июня 2019

Передать как список идентификаторов песен в songDao и получить как список в одном запросе. songDao.findByIdIn (Список songIds).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...