【发布时间】:2014-11-06 08:06:56
【问题描述】:
考虑以下场景:
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:
update users set balance = $1, rating = $2 where id = $3;
-- update teams as well
但我明白了:
update users set balance = $1, rating = $2, team_id = $3; -- why's the team updated huh?
这是正常行为吗?我怀疑team_id 已更新以保证数据一致性,因为我们也更新了团队行。我说的对吗?
【问题讨论】:
-
@M.Deinum,请查看更新。
login字段未更改。 -
团队很脏,所以得到一个更新(你正在做一些增加团队评级的事情),hibernate 然后认为,由于团队脏,它也需要更新该字段。有趣的是,历史上所有字段都已更新(但可能已随 JPA 更改,不确定)。
-
这些是完整的 SQL 语句吗?没有 WHERE 子句?
-
@ThomasStets,感谢您的指点。肯定有
where子句。 -
@M.Deinum,我正确查看了日志,您是对的 - 只是所有字段都已更新。您能否将您的评论转换为答案,以便我接受。