Как я могу моделировать 3 объекта с уникальными ограничениями и их отношениями? - PullRequest
0 голосов
/ 14 января 2019

У меня есть 3 класса сущностей. Это «Игра», «Описание игры», «Язык». У игры может быть много описаний, но не более одного описания с языком. Например, игра может иметь 2 описания: одно на английском, другое на французском. Эта игра может иметь только одно английское описание, остальные могут быть на других языках. Как я могу смоделировать это в моем проекте Spring Boot с Spring Data и JPA?

Игра

идентификатор / имя / описание игры

GameDescription

id / game_id / language_id / text

Язык

идентификатор / имя

Я попытался установить взаимосвязь OneToMany между сущностями Game & GameDescription и взаимосвязь ManyToOne между сущностями GameDescription и Language, чтобы выполнить сопоставление между этими 3 сущностями. Но это не обеспечивает требуемого результата.

Игровая сущность

@Entity
@Table(name="GAME")
public class Game {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "game")
    private List<GameDescription> descriptions;

    // getters and setters
 }

GameDescription Entity

@Entity
@Table(name = "GAME_DESCRIPTION")
public class GameDescription {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "GAME_ID")
    private Game game;

    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE,
        CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinColumn(name = "LANG_ID")
    private Language language;

    // getters and setters
}

Language Entity

@Entity
@Table(name = "LANGUAGE")
public class Language {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

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

    // getters and setters
}

Мне нужно, чтобы эти три объекта были хорошо структурированы, так как для каждого языка должно быть только одно описание игры. Например, я ожидаю игру с описаниями на 5 разных языках.

1 Ответ

0 голосов
/ 14 января 2019

Другой подход заключается в использовании составного первичного ключа с использованием @Embeddable и @EmbeddedId. Для этого вы должны изменить сущность GameDescription и создать новый класс с аннотацией @Embeddable. Как то так

@Embeddable
public class GameDescriptionId implements Serializable {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "GAME_ID")
    private Game game;

    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE,
    CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinColumn(name = "LANG_ID")
    private Language language;
    // getters, setters, override equals and hashcode
}

Затем измените GameDescription сущность

@Entity
@Table(name = "GAME_DESCRIPTION")
public class GameDescription {

    @EmbeddedId
    private GameDescriptionId id;
    private String text;
    // getters setters

}

Подробнее об этом можно прочитать здесь https://vladmihalcea.com/the-best-way-to-map-a-composite-primary-key-with-jpa-and-hibernate/

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