我正在尝试构建一个简单的全堆栈井字游戏应用程序,但在定义一对多关系时遇到了一些问题。

在上下文中,我们有一个主表游戏:

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


和辅助表Gamesteps:

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


我正在尝试通过主实体(游戏)上的CRUDRepository接口执行Save / findAll操作,并在所有其他子实体上执行自动Save / findAll的可能性(游戏步骤)。

对我来说不清楚我应该在哪里使用@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'

最佳答案

如果您希望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;


您还可以阅读有关此here的信息

我希望这有帮助

关于java - Spring Boot JPA-定义一对多关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59840815/

10-13 09:08