java - 两个表可以互相引用吗?

标签 java hibernate jpa orm relational-database

我有两个表,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/

相关文章:

java - 在我的 GWT 应用程序运行时 (java.io.FilePermission) 上没有对文件的读/写访问权限

c# - zip 文件中 unicode 文件名的兼容性问题

java - 将java网站移至小程序

java - 没有连接表的单向一对多关系

jpa - persistence.xml 数据源和 web.xml/ibm-web-bnd.xml 资源引用之间的关系

java - 如何在同一个 Hibernate 事务中运行原生 SQL 查询?

java - 将集合层次结构可视化为彩色编码图

java - JSTL <fmt :formatData> time zone problem

Mysql自定义序列生成器(如oracle)

java - 在 @Table(name = "tableName") - 使 "tableName"成为 JPA 中的变量