【问题标题】:hibernate - generated SQL contains more fields than I updatehibernate - 生成的 SQL 包含的字段比我更新的要多
【发布时间】: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,我正确查看了日志,您是对的 - 只是所有字段都已更新。您能否将您的评论转换为答案,以便我接受。

标签: java spring hibernate


【解决方案1】:

当您尝试更改与其他域相关的域的任何值时,例如您的情况 Many Users to a Team Unidirectional with User as the Relation Holder。这里您将拥有Team as an object for every User domain,因此当您更新用户对象时,它将尝试更新域User 的每个字段,因此它还将尝试更新与用户关联的Team 对象。

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

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    相关资源
    最近更新 更多