例如,假设我想使用用户和团队的主键将球员分配给球队:
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)
答案 0 :(得分:1)
不,这不是个好主意。
首先,不需要调用merge()。
其次,有一种标准方法可以从ID创建实体,而不执行任何查询:getReference()
。
Team team = em.find(Team.class, teamId);
team.getPlayers().add(em.getReference(Player.class, playerId));
至少使用getReference(),您将获得一个真实的托管实体。如果代码稍后在事务中碰巧调用该播放器上的方法,则不会得到null
:JPA将加载播放器状态,并返回正确的值。