将 JPA 实体用作 "shell" 来保存主键是否可以,或者这是一种不好的做法?

Is it okay to just use JPA entities as a "shell" to hold primary keys or is that a bad practice?

例如,假设我想使用用户和球队的主键将一名球员分配给球队:

myEjb.java

public void assignPlayer(Integer teamId, Integer playerId) {
    Team team = em.find(Team.class, teamId);
    team.getPlayers().add(new Player(playerId));
    em.merge(team);
    .
    .
}

这样做有错吗?我觉得通过将播放器主键包装在对象中而不是先做,我正在为自己节省额外的数据库读取:

Player player = em.find(Player.class, playerId)

不,这不是个好主意。

首先,不需要调用 merge()。

其次,有一种标准方法可以根据 ID 创建实体,无需执行任何查询:getReference()

Team team = em.find(Team.class, teamId);
team.getPlayers().add(em.getReference(Player.class, playerId));

至少使用 getReference(),您会得到一个真实的托管实体。如果稍后在事务中的代码恰好调用了该播放器的方法,它不会得到 null 作为结果:JPA 将加载播放器状态,并 return 正确的值。