Spring Boot JPA - Определить отношения один ко многим - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь создать простое полное приложение стека ti c -ta c -ee, но у меня есть некоторые проблемы при определении отношения один-ко-многим.

здесь контекст У нас есть главный стол Игры:

CREATE TABLE `tictactoe`.`games` (
  `idgames` INT NOT NULL AUTO_INCREMENT,
  `gridConf` VARCHAR(45) NOT NULL,
  `playerNum` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`idgames`));

и дополнительный стол, Игровые шаги:

CREATE TABLE `tictactoe`.`gamesteps1` (
  `idgamesteps` INT NOT NULL AUTO_INCREMENT,
  `idgame` INT NOT NULL,
  `step` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`idgamesteps`));

Я бы хотел определить отношение Один (Игра) ко Многим (Игры) где комбо Gamesteps.idgamesteps и Gamesteps.games является первичным ключом таблицы Gamesteps.

У меня есть два сомнения:

1 - как мне определить мои таблицы БД? мои права запросов или мне нужен явный первичный ключ?

2 -JPA аннотации: здесь мои сущности:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Games {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idgames;

    private String gridConf;

    private Integer playerNum;

    @OneToMany(mappedBy = "idgames")
    private Set<GameSteps> gameSteps;

//all setter/getters

вторичная таблица:

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class GameSteps {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idGameSteps;

     @ManyToOne
     @JoinColumn(name = "idgames", referencedColumnName = "idgames")
     private Integer idgame;

    private String step;

//all setter/getter

i я пытаюсь заархивировать возможность выполнения операции Save / findAll через мой интерфейс CRUDRepository на главном объекте (Games) и автоматически c Save / findAll на всех других дочерних объектах (gamesteps).

для меня не ясно, где я должен использовать аннотации @OneToMany или @ManyToOne. На данный момент я получаю только исключения.

Если вам нужна другая информация, просто спросите, любой тип справки / документации будет очень кстати!

Спасибо!


После комментария @Smutje я изменился на:

public class GameSteps {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer idGameSteps;

@ManyToOne
@JoinColumn(name = "idgames", referencedColumnName = "idgames")
private **Games** idgame;

и

    @OneToMany(mappedBy = "**idgame**")
private Set<GameSteps> gameSteps;

, но получил:

java.sql.SQLSyntaxErrorException: Unknown column 'idgames' in 'field list'

1 Ответ

2 голосов
/ 21 января 2020

Если вы хотите, чтобы Gamesteps.idgamesteps и Gamesteps.games были первичным ключом в таблице Gamesteps. Вы должны использовать теги @EmbeddedId и @Embeddable, ваш составной ключ должен быть другого класса.

Поля первичного ключа определены в встраиваемом классе. Сущность содержит одно поле первичного ключа, аннотированное @EmbeddedId, и содержит экземпляр этого встраиваемого класса.

Примерно так:

import javax.persistence.*;

@Entity
public class GameSteps {

    @EmbeddedId
    private GameStepsPK pk;

    private String step;

// getters and setters

GameStepsPK будет составным ключом

    import java.io.Serializable;
import javax.persistence.*;

@Embeddable
public class ExploitationEvaluationPK implements Serializable {

    private static final long serialVersionUID = 1L;

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idGameSteps;

    @ManyToOne
    @JoinColumn(name = "idgames", referencedColumnName = "idgames")
    private Games idgames;

Вы также можете прочитать об этом здесь

Надеюсь, это поможет

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