【问题标题】:does hibernate check whether the object has actually changed or does it assume that if the setter was called?hibernate 会检查对象是否实际发生了变化,还是假设 setter 被调用了?
【发布时间】:2015-04-19 15:47:44
【问题描述】:

我正在使用带有 Spring 框架的 Hibernate,并且遇到了 Opportunistic Locking,所以我有一个基本问题:

Hibernate 是否会在调用其 setter 时立即考虑对象“已更改/脏”,例如:theEmployee.setAge(32) 因此,即使 age 已经是 32,它也会被视为“已更改”,或者会Hibernate 发现即使调用了 setter,对象实际上并没有改变?

也就是说,如果我想防止不必要的写入,是否需要编码:

if (theEmployee.getAge() != age) { theEmployee.setAge(age); }

...或者编码就足够了:theEmployee.setAge(age);

【问题讨论】:

标签: java hibernate


【解决方案1】:

您可以很容易地对此进行测试。但答案是 Hibernate 测试对象的实际状态。如果对象状态与加载时相同,则不执行任何更新查询。

【讨论】:

  • 我说得对吗,当调用 EntityManager.merge() 而不是调用 setter 方法时,休眠检查对象状态?
  • 没有。当 Hibernate 需要刷新会话时检查状态。
  • 我想这叫做“脏检查”:)
【解决方案2】:

框架(Hibernate)确实“搞定”并且不会在数据库中执行任何操作——我不得不说这太棒了。

【讨论】:

    【解决方案3】:

    如果对象有任何变化,那么在 hibernate 中只会调用更新查询。您可以在这里详细了解对象的状态:Hibernate - State of objects

    从上面的链接一瞥:

    实体的状态是Hibernate中一个非常重要的概念。一个实体可以有不同的状态。使用 Hibernate 与使用 SQL 不同。如果您调用 session.save(customerObject),则不会插入 customer...查询数据库。 Hibernate 将设置 id 属性(如果生成了 id)并将实体绑定到持久性上下文。调用 transaction.commit() 时,持久性上下文与数据库同步。

    这种方法有很多优点:

    您可以继续更新实体,并且对 Java 对象的所有更改都通过单个数据库插入/更新进行持久化。 数据库表行的更新导致行锁。仅在事务结束时短暂锁定行,可防止并发用户锁定或死锁情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多