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,我正确地查看了日志,你说得对,只是更新了所有字段。你能把你的评论转换成回答吗?这样我就可以接受了。