我正在使用Spring + H2数据库开发一个桌面游戏。目前,我面临 ORM 问题。我有三个班级:
cards
、players
和tabletop
。
tabletop
类有两个cards
列表和一个players
列表。反过来,玩家有两个 cards
列表。我应该如何处理映射?
我可以成功地将数据保存到数据库,但是当我尝试为
tabletop
查找ById时,关联的对象变成了null
。
我尝试使用以下方式绘制地图:
@Entity
public class Tabletop{
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
@OneToOne(mappedBy = "tabletop")
private BaseCards baseCards;
@OneToOne(mappedBy = "tabletop")
private FieldCards fieldCards;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "tabletop_id")
private List<Player> players;
}
@Entity
public class Player {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
@OneToOne(mappedBy = "player")
private PlayerHandCards handCards;
@OneToOne(mappedBy = "player")
private PlayerBinCards binCards;
}
@Entity
public class PlayerHandCards {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
@OneToMany( cascade = CascadeType.ALL)
@JoinColumn(name="player_hand_id")
List<Cards> Cards;
@OneToOne
@JoinColumn(name = "player_id")
private Player player;
}
@Entity
public class PlayerBinCards {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
@OneToMany( cascade = CascadeType.ALL)
@JoinColumn(name="player_bin_id")
List<Cards> cards;
@OneToOne
@JoinColumn(name = "player_id")
private Player player;
}
@Entity
public class BaseCards {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
@OneToMany( cascade = CascadeType.ALL)
@JoinColumn(name="base_cards_id")
List<Cards> cards;
@OneToOne
@JoinColumn(name = "Tabletop_id")
private Tabletop tabletop;
}
@Entity
public class FieldCards {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
@OneToMany( cascade = CascadeType.ALL)
@JoinColumn(name="field_cards_id")
List<Cards> cards;
@OneToOne
@JoinColumn(name = "Tabletop_id")
private Tabletop tabletop;
}
@Entity
public class Cards{
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
private String color;
private Integer value;
}
没关系,我找到了解决方案和我的错误。 我创建了 2 个具有相同 id 的 @OneToOne 关系,我应该做的是
@OneToMany( cascade = CascadeType.ALL) @JoinTable( name = "player_hand_cards", joinColumns = @JoinColumn(name = "player _id"), inverseJoinColumns = @JoinColumn(name = "card_id") ) private List<Cards> playerHandCards = new ArrayList<>();