将 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 正确的值。
例如,假设我想使用用户和球队的主键将一名球员分配给球队:
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 正确的值。