我有两个表,Team 和 Player(一对多)。
我的第一个问题,让两个表像这样互相引用是不是不好的做法?
Team: (id (pk), name, captain_id (fk))
Player: (id (pk), name, team_id (fk))
我正在使用 JPA 和 hibernate,并进行以下设置。
@Entity
public class Player {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
@ManyToOne
@JoinColumn(name="team_id")
private Team team;
}
@Entity
public class Team {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private int captainId;
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
private Set<Player> players;
在创建新团队时,创建该团队的玩家的 ID 将作为参数传递。它工作正常,但手动执行感觉不太好。
public void createNewTeam(Player player, Team team){
Set<Player> players = new HashSet<Player>();
Team team = new Team("Cowboys", player.getId(), players); //player.getId is the captain()
player.setTeam(team);
players.add(player);
PersistenceUtil.merge(team);
}
有没有办法以某种方式更改实体以自动执行此操作?或者我需要更换表格吗?
我一直在尝试使用 gson 将对象转换为 JSON,但没有成功。我认为这与循环引用有关。 (是的,我是一个陷得太深的菜鸟!)
最佳答案
您在此处描述的内容:
Team: (id (pk), name, captain_id (fk))
Player: (id (pk), name, team_id (fk))
这是错误的,不应该这样配置。
如果您想在 2 个实体之间配置一对多关联,
那么正确的方法是:
首先,决定哪个实体是Many
,哪个实体是Single(One)
,在我们的例子中,这非常简单。每个玩家属于一个
团队,每个团队有许多
玩家。
团队 --> 一个
玩家 --> 很多
第二,如果您尝试用表格来表示这种关联,那么许多(玩家)应该拥有一个(团队)的 fk,并且团队不应该持有玩家的 fk,应该只有一个fk 在这个协会中。
为什么?
假设您的队伍 table 上有一支队伍,PK 为 211,该队伍有很多玩家,比如说 ID 为 100、101、102 的玩家。
团队 table 上不能有 3 条记录(针对 3 个不同的玩家 100、101、102)具有相同的 PK 211
关于java - 两个表可以互相引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40429938/