#java #spring #database #hibernate #jpa
Вопрос:
У меня есть приложение для сбора игр, в котором я хочу создавать отдельные списки игр. Я использую Spring JPA и Hibernate в бэкэнде, и именно так сейчас выглядят классы сущностей.
@Entity
public class Game {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "game_genre",
joinColumns = @JoinColumn(name = "game_id"),
inverseJoinColumns = @JoinColumn(name = "genre_id"))
private Set<Genre> genres;
private int rating;
@ElementCollection
private List<String> platforms;
private String publisher;
private LocalDate releaseDate;
@ManyToOne
private GameShelf gameShelf;
}
@Entity
public class GameShelf {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "gameShelf")
private Set<Game> games;
}
@Entity
public class Genre {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(mappedBy = "genres")
private List<Game> games;
}
Я не уверен, что это вообще правильный подход… В конце концов, я хочу создать приложение Spring Boot, в котором пользователи смогут входить в систему (еще не реализовано) и управлять своими собственными списками (ноль или более списков для каждого пользователя).
В моем случае, не будет ли у меня в конечном итоге много дубликатов игр на моем игровом столе? Допустим, я создаю несколько списков и добавляю в каждый одну и ту же игру, в моем случае я получу несколько строк одной и той же игры, сопоставленных разным спискам.
Есть ли здесь лучший подход? И, может быть, существует обобщенный подход к решению подобных проблем с отношениями с базами данных, который я могу применить к будущим проблемам?
Комментарии:
1. Трудно сказать, не видя сопоставления для пользователя и его связи с игрой или полкой… «управляйте своими собственными списками (ноль или более списков для каждого пользователя)» Списками чего? Игры? Полки?
2. Пользователи @SteveEbersole могут создавать полки, на которые они затем могут добавлять игры вручную через конечную точку веб-службы. Предполагается, что это станет простым приложением для управления мультимедиа, в котором вы сможете создавать списки (полки) и добавлять игры вручную в каждую.
3. Итак, вы спрашиваете, будет ли игра (например, «Последний из нас») повторяться, если несколько пользователей добавят ее на свою полку? Как правило, вы хотели бы нормализовать это — для этой игры была бы только одна строка. Именно так лучше всего работают реляционные базы данных — нормализованные
Ответ №1:
Отношения между вашей игровой полкой и играми должны быть самыми разными. Вам нужны игры на многих полках и полки со многими играми. Использование этой связи создает третью таблицу, которая будет управлять связями между ними, и вы не получите дублирующихся игр или полок ни в одной таблице.