我正在尝试构建一个简单的全堆栈井字游戏应用程序,但在定义一对多关系时遇到了一些问题。
在上下文中,我们有一个主表游戏:
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/