java - Hibernate:错误 'foo' 中的未知列 'field list' - 从一个实体到同一父实体的两个 @ManyToOne 关系

标签 java mysql hibernate

我正在使用 Hibernate 5.2.10 持久保存 MySQL 数据库 enter image description here

子 table 游戏有几个特点:

首先它有一个由4列组成的复合主键,即leagueId,也是League的外键,seasonId,也是League的外键季节键,回合号游戏号

其次,表的两个外键指向同一个表,即 Club.id:homeTeamIdawayTeamId

我正在尝试查询俱乐部实体,但我不断收到相同的错误消息。

查询:

List<Game> gameList = session.createQuery("FROM Game g WHERE g.id.leagueId = 1L  AND g.id.seasonId = 1L AND g.id.roundNo = 35 AND g.id.gameNo = 7")
    .getResultList();

翻译成这样:

hibernate :选择game0_.gameNo为gameNo1_1_、game0_.leagueId为 leagueId2_1_、game0_.roundNo为roundNo3_1_、game0_.seasonId为seasonId4_1_、game0_.clubAway为clubAway5_1_、game0_.clubHome为clubHome6_1_、game0_.date为date7_1_ 、game0_.gameDescr 为 gameDesc8_1_、game0_.league 为 league9_1_、game0_.played 为 Play10_1_、game0_.postponed 为 postpon11_1_、game0_.season 为 season12_1_ 来自游戏 game0_,其中 game0_.leagueId=1 且 game0_.seasonId=1 且 game0_.roundNo= 35 和 game0_.gameNo=7

错误:

错误:“字段列表”中存在未知列“game0_.clubAway”

我认为错误可能是由于这两个外键指向同一个俱乐部表,但我很迷失,不知道如何解决这个问题。我认为我的实体类已正确映射。

游戏

@Entity
@Table(name = "game")
public class Game implements Serializable {

    private static final long serialVersionUID = 1L;
    @EmbeddedId
    private GameId id;
    @Temporal(TemporalType.DATE)
    private Date date;
    private Boolean postponed;
    private Boolean played;
    private String gameDescr;

    private League league;
    private Season season;
    private Club clubHome;
    private Club clubAway;

    public Game() {
    }

    //unannotated getters and setters omitted for brevity

    @ManyToOne
    @JoinColumn(name="leagueId", referencedColumnName="id", table="League")
    public League getLeague() {
        return league;
    }

    @ManyToOne
    @JoinColumn(name="seasonId", referencedColumnName="id", table="Season")
    public Season getSeason() {
        return season;
    }

    @ManyToOne
    @JoinColumn(name="homeTeamId", referencedColumnName="id", table="Club")
    public Club getClubHome() {
        return clubHome;
    }   

    @ManyToOne
    @JoinColumn(name="awayTeamId", referencedColumnName="id", table="Club")
    public Club getClubAway() {
        return clubAway;
    }
}

GameId 类:

@Embeddable
public class GameId implements Serializable{

    private static final long serialVersionUID = 1L;
    private Long leagueId;
    private Long seasonId;
    private Integer roundNo;
    private Integer gameNo;

    public GameId() {
    }

    //getters and setters omitted for brevity

    @Override
    public int hashCode() {
        // code omitted for brevity
    }

    @Override
    public boolean equals(Object obj) {
        //code omitted for brevity
    }
}

俱乐部类别:

@Entity
@Table(name = "Club")
public class Club implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String clubName;

    private League league;

    public Club() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    //unannotated getters and setters omitted for brevity

    @ManyToOne
    @JoinColumn(name = "currentLeagueId")
    public League getLeague() {
        return league;
    }
}

联赛级别:

@Entity
public class League implements Serializable {

    private static final long serialVersionUID = 1L;
    private Long id;
    private String leagueName;
    private String descr;

    public League() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    //unannotated getters and setters omitted for brevity
}

季节类别:

@Entity
@Table(name="season")
public class Season implements Serializable {

    private static final long serialVersionUID = 1L;
    private Long id;
    private Integer yearBegin;
    private Integer yearEnd;
    private String descr;

    public Season(){
    }

    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    //unannotated getters and setters omitted for brevity
}

此处显示的表是整个数据库的子集,该数据库由 7 个表组成,但我已经针对所有其他 6 个实体测试了查询,并且它们运行顺利。问题肯定出在 Game 实体中,但我不知道它出了什么问题。有人能解释一下这个问题吗?预先非常感谢所有提供帮助的人!

最佳答案

我找到了解决方案。这看起来很疯狂,但我所需要做的就是将 @EmbeddedId 注释从字段移动到 Game 类中的 getter。

现在游戏类是:

@Entity
@Table(name = "game")
public class Game implements Serializable {

    private static final long serialVersionUID = 1L;
    private GameId id;
    @Temporal(TemporalType.DATE)
    private Date date;
    private Boolean postponed;
    private Boolean played;
    private String gameDescr;

    private League league;
    private Season season;
    private Club clubHome;
    private Club clubAway;

    public Game() {
    }

    @EmbeddedId
    public GameId getId() {
        return id;
    }
    //everything else stays the same

关于java - Hibernate:错误 'foo' 中的未知列 'field list' - 从一个实体到同一父实体的两个 @ManyToOne 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44034629/

相关文章:

java - 命令行参数的 ArrayIndexOutOfBoundsException

两个数据库之间的Mysql数据库同步

mysql - 如何计算年份及其值(value)?

Mysql 一对多表

mysql - 在启动时创建数据库 View - JPA

mysql - JPA 实体 - MySQL 表映射

java - MySQL 的 Tiny int 到 Java 中的 Integer

java - 配置三叶草排除文件模式

java - 单击鼠标交换按钮图标

java - JTable fireDataChanged 重复单元格值