Hibernate 无法创建 table: org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table PSQLException
Hibernate can't create a table: org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table PSQLException
我有 5 个实体:Field、Game、Move、Player 和 User。一个游戏有两个玩家,一个玩家只与一个游戏相关联;一个用户关联多个玩家,一个玩家可以做很多动作,而每个动作只能有一个玩家;一个游戏有两个玩家,很多动作和很多领域。
Hibernate 为其中的 4 个创建了 tables 和约束,没有任何问题。但是,当它尝试为 Move 实体创建 table 时,它会抛出异常:
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table moves (id int4 not null, column int4 not null, row int4 not null, game_id int4, player_id int4, primary key (id))" via JDBC Statement
之后
org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException
WARN: GenerationTarget encountered exception accepting command : Error executing DDL "alter table moves add constraint FKjv33kkwwhe6121266nmuk7y1d foreign key (game_id) references games" via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "alter table moves add constraint FKjv33kkwwhe6121266nmuk7y1d foreign key (game_id) references games" via JDBC Statement
几次。
我不明白 Move 实体有什么问题。
这是我的代码:
字段:
package noughtsandcrosses.entity;
import javax.persistence.*;
@Entity
@Table(name = "fields")
public class Field {
@Id
@GeneratedValue
private int id;
private int[][] field;
@ManyToOne
@JoinColumn(name = "game_id")
private Game game;
public void update(Move move) {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int[][] getField() {
return field;
}
public void setField(int[][] field) {
this.field = field;
}
public Game getGame() {
return game;
}
public void setGame(Game game) {
this.game = game;
}
}
游戏:
package noughtsandcrosses.entity;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "games")
public class Game {
@Id @GeneratedValue
private int id;
@OneToOne
@JoinColumn(name = "crosses_player_id")
private Player crossesPlayer;
@OneToOne
@JoinColumn(name = "noughts_player_id")
private Player noughtsPlayer;
@OneToMany(mappedBy = "game")
private List<Move> moves;
@OneToMany(mappedBy = "game")
private List<Field> fields;
public Game(Player crossesPlayer, Player noughtsPlayer) {
this.crossesPlayer = crossesPlayer;
this.noughtsPlayer = noughtsPlayer;
}
public Player getCrossesPlayer() {
return crossesPlayer;
}
public void setCrossesPlayer(Player crossesPlayer) {
this.crossesPlayer = crossesPlayer;
}
public Player getNoughtsPlayer() {
return noughtsPlayer;
}
public void setNoughtsPlayer(Player noughtsPlayer) {
this.noughtsPlayer = noughtsPlayer;
}
public List<Move> getMoves() {
return moves;
}
public void setMoves(List<Move> moves) {
this.moves = moves;
}
public List<Field> getFields() {
return fields;
}
public void setFields(List<Field> fields) {
this.fields = fields;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
移动:
package noughtsandcrosses.entity;
import javax.persistence.*;
@Entity
@Table(name = "moves")
public class Move {
@Id
@GeneratedValue
private int id;
@ManyToOne
@JoinColumn(name = "player_id")
private Player player;
@ManyToOne
@JoinColumn(name = "game_id")
private Game game;
private int row;
private int column;
public Move() {}
public Move(Player player, int row, int column) {
this.player = player;
this.row = row;
this.column = column;
}
public Player getPlayer() {
return player;
}
public int getRow() {
return row;
}
public int getColumn() {
return column;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setPlayer(Player player) {
this.player = player;
}
public void setRow(int row) {
this.row = row;
}
public void setColumn(int column) {
this.column = column;
}
public Game getGame() {
return game;
}
public void setGame(Game game) {
this.game = game;
}
}
玩家:
package noughtsandcrosses.entity;
import javax.persistence.*;
import java.util.List;
@Entity
@Table(name = "players")
public class Player {
@Id @GeneratedValue
private int id;
private enum Alignment {
NOUGHTS, CROSSES
};
private Alignment alignment;
@ManyToOne
private User user;
@OneToMany(mappedBy = "player")
private List<Move> moves;
public Player() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Alignment getAlignment() {
return alignment;
}
public void setAlignment(Alignment alignment) {
this.alignment = alignment;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Move> getMoves() {
return moves;
}
public void setMoves(List<Move> moves) {
this.moves = moves;
}
}
用户:
package noughtsandcrosses.entity;
import javax.persistence.*;
import java.util.*;
@Entity
@Table(name = "users")
@Inheritance(strategy = InheritanceType.JOINED)
public class User {
@Id
@GeneratedValue
private int id;
private String username;
private String password;
@OneToMany(mappedBy="user")
private List<Player> players;
public User() {}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public User(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List<Player> getPlayers() {
return players;
}
public void setPlayers(List<Player> players) {
this.players = players;
}
}
Hibernate 应该给你一个真正的错误信息,而不只是告诉你哪个命令失败了。它不这样做吗? Hibernate 非常流行(但我个人并不喜欢),所以我怀疑它是否会损坏到无法 return 真正的错误消息,所以我认为您只是没有正确阅读它们。无论如何,您可以查看 PostgreSQL 的日志文件以找到真正的错误消息
如果我从您显示的消息中获取语句并 运行 它在 psql 中,我得到:
create table moves (id int4 not null, column int4 not null, row int4 not null, game_id int4, player_id int4, primary key (id));
ERROR: syntax error at or near "column"
这里的问题是 column
在 PostgreSQL 中是一个 reserved word。您不能将它用作列的名称,除非您将它放在双引号中。我不知道如何告诉 hibernate 将它放在双引号中,但我确信有办法。但最好只是将其命名为 board_column
之类的名称。 row
在 PostgreSQL 中不是完全保留字,所以你可以使用它,但我不会这样做。将其重命名为 board_row
.
我有 5 个实体:Field、Game、Move、Player 和 User。一个游戏有两个玩家,一个玩家只与一个游戏相关联;一个用户关联多个玩家,一个玩家可以做很多动作,而每个动作只能有一个玩家;一个游戏有两个玩家,很多动作和很多领域。
Hibernate 为其中的 4 个创建了 tables 和约束,没有任何问题。但是,当它尝试为 Move 实体创建 table 时,它会抛出异常:
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table moves (id int4 not null, column int4 not null, row int4 not null, game_id int4, player_id int4, primary key (id))" via JDBC Statement
之后
org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException
WARN: GenerationTarget encountered exception accepting command : Error executing DDL "alter table moves add constraint FKjv33kkwwhe6121266nmuk7y1d foreign key (game_id) references games" via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "alter table moves add constraint FKjv33kkwwhe6121266nmuk7y1d foreign key (game_id) references games" via JDBC Statement
几次。
我不明白 Move 实体有什么问题。 这是我的代码:
字段:
package noughtsandcrosses.entity;
import javax.persistence.*;
@Entity
@Table(name = "fields")
public class Field {
@Id
@GeneratedValue
private int id;
private int[][] field;
@ManyToOne
@JoinColumn(name = "game_id")
private Game game;
public void update(Move move) {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int[][] getField() {
return field;
}
public void setField(int[][] field) {
this.field = field;
}
public Game getGame() {
return game;
}
public void setGame(Game game) {
this.game = game;
}
}
游戏:
package noughtsandcrosses.entity;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "games")
public class Game {
@Id @GeneratedValue
private int id;
@OneToOne
@JoinColumn(name = "crosses_player_id")
private Player crossesPlayer;
@OneToOne
@JoinColumn(name = "noughts_player_id")
private Player noughtsPlayer;
@OneToMany(mappedBy = "game")
private List<Move> moves;
@OneToMany(mappedBy = "game")
private List<Field> fields;
public Game(Player crossesPlayer, Player noughtsPlayer) {
this.crossesPlayer = crossesPlayer;
this.noughtsPlayer = noughtsPlayer;
}
public Player getCrossesPlayer() {
return crossesPlayer;
}
public void setCrossesPlayer(Player crossesPlayer) {
this.crossesPlayer = crossesPlayer;
}
public Player getNoughtsPlayer() {
return noughtsPlayer;
}
public void setNoughtsPlayer(Player noughtsPlayer) {
this.noughtsPlayer = noughtsPlayer;
}
public List<Move> getMoves() {
return moves;
}
public void setMoves(List<Move> moves) {
this.moves = moves;
}
public List<Field> getFields() {
return fields;
}
public void setFields(List<Field> fields) {
this.fields = fields;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
移动:
package noughtsandcrosses.entity;
import javax.persistence.*;
@Entity
@Table(name = "moves")
public class Move {
@Id
@GeneratedValue
private int id;
@ManyToOne
@JoinColumn(name = "player_id")
private Player player;
@ManyToOne
@JoinColumn(name = "game_id")
private Game game;
private int row;
private int column;
public Move() {}
public Move(Player player, int row, int column) {
this.player = player;
this.row = row;
this.column = column;
}
public Player getPlayer() {
return player;
}
public int getRow() {
return row;
}
public int getColumn() {
return column;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setPlayer(Player player) {
this.player = player;
}
public void setRow(int row) {
this.row = row;
}
public void setColumn(int column) {
this.column = column;
}
public Game getGame() {
return game;
}
public void setGame(Game game) {
this.game = game;
}
}
玩家:
package noughtsandcrosses.entity;
import javax.persistence.*;
import java.util.List;
@Entity
@Table(name = "players")
public class Player {
@Id @GeneratedValue
private int id;
private enum Alignment {
NOUGHTS, CROSSES
};
private Alignment alignment;
@ManyToOne
private User user;
@OneToMany(mappedBy = "player")
private List<Move> moves;
public Player() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Alignment getAlignment() {
return alignment;
}
public void setAlignment(Alignment alignment) {
this.alignment = alignment;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Move> getMoves() {
return moves;
}
public void setMoves(List<Move> moves) {
this.moves = moves;
}
}
用户:
package noughtsandcrosses.entity;
import javax.persistence.*;
import java.util.*;
@Entity
@Table(name = "users")
@Inheritance(strategy = InheritanceType.JOINED)
public class User {
@Id
@GeneratedValue
private int id;
private String username;
private String password;
@OneToMany(mappedBy="user")
private List<Player> players;
public User() {}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public User(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List<Player> getPlayers() {
return players;
}
public void setPlayers(List<Player> players) {
this.players = players;
}
}
Hibernate 应该给你一个真正的错误信息,而不只是告诉你哪个命令失败了。它不这样做吗? Hibernate 非常流行(但我个人并不喜欢),所以我怀疑它是否会损坏到无法 return 真正的错误消息,所以我认为您只是没有正确阅读它们。无论如何,您可以查看 PostgreSQL 的日志文件以找到真正的错误消息
如果我从您显示的消息中获取语句并 运行 它在 psql 中,我得到:
create table moves (id int4 not null, column int4 not null, row int4 not null, game_id int4, player_id int4, primary key (id));
ERROR: syntax error at or near "column"
这里的问题是 column
在 PostgreSQL 中是一个 reserved word。您不能将它用作列的名称,除非您将它放在双引号中。我不知道如何告诉 hibernate 将它放在双引号中,但我确信有办法。但最好只是将其命名为 board_column
之类的名称。 row
在 PostgreSQL 中不是完全保留字,所以你可以使用它,但我不会这样做。将其重命名为 board_row
.