Java hibernate生成的SQL包含的字段比我更新的多

Java hibernate生成的SQL包含的字段比我更新的多,java,spring,hibernate,Java,Spring,Hibernate,考虑以下场景: class User { Long id; BigDecimal balance; BigDecimal rating; @ManyToOne Team team; } class Team { Long id; BigDecimal rating; } 在代码中,我有以下内容: @Transactional void updateBalance(...) { user.addBalance(balance);

考虑以下场景:

class User {
  Long id;
  BigDecimal balance;
  BigDecimal rating;

  @ManyToOne
  Team team;
}

class Team {
  Long id;
  BigDecimal rating;
}
在代码中,我有以下内容:

@Transactional
void updateBalance(...) {
   user.addBalance(balance);                  // add balance
   increaseUserRating(user, balance);         // update rating by an algorithm
   increaseTeamRating(user.getTeam(), balance);// update team rating by an algorithm
}
因此,我希望执行以下SQL:

updateusers set balance=$1,rating=$2,其中id=$3;
--同时更新团队
但我得到:

updateusers set balance=$1,rating=$2,team_id=$3;--为什么团队更新了,嗯?

这是正常的行为吗?我怀疑
team_id
已经更新,以保证数据的一致性,因为我们也更新了team行。我说的对吗?

当您尝试更改与其他域相关的域的任何值时,例如您的案例
一个团队的许多用户都是单向的,用户是关系持有者
。在这里,您将
团队作为每个用户域的对象
,因此当您更新用户对象时,它将尝试更新域
用户
的每个字段,因此它也将尝试更新与用户关联的
团队
对象


此外,如果您尝试更新
团队
对象,则不会更新用户对象。

@M.Deinum,请参阅更新<代码>登录字段保持不变。团队不干净,因此会得到更新(您正在做一些提高团队评级的事情),hibernate然后认为,由于团队不干净,它也需要更新该字段。顺便说一句,历史上所有更新的字段都很有趣(但可能已随JPA更改,不确定)。这些是完整的SQL语句吗?没有WHERE子句?@ThomasStets,谢谢你的指点。确实有
where
子句。@M.Deinum,我正确地查看了日志,你说得对,只是更新了所有字段。你能把你的评论转换成回答吗?这样我就可以接受了。