hibernate检查对象是否实际更改了,还是假设是否调用了setter?

时间:2015-04-19 15:47:44

标签: java hibernate

我正在使用Hibernate和Spring框架,并遇到机会锁定,所以我有一个基本问题:

Hibernate是否会考虑对象"更改/脏"一旦调用它的setter,例如:theEmployee.setAge(32)所以即使age已经32,它也会被视为"更改"或者Hibernate将即使调用了setter,这个对象实际上还没有改变?

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

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

......或者只需编码:theEmployee.setAge(age);

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

框架(Hibernate)确实“搞清楚”并且不会在数据库中执行任何操作 - 这非常棒我不得不说。

答案 2 :(得分:0)

如果对象有任何更改,则只在hibernate中调用更新查询。您可以在此处详细了解对象的状态:Hibernate - State of objects

以上链接的一瞥:

  

实体的状态是Hibernate的一个非常重要的概念。实体可以具有不同的状态。使用Hibernate与使用SQL不同。如果你callsession.save(customerObject)那么没有插入客户...查询到数据库。 Hibernate将设置id属性(如果生成了id)并将实体绑定到持久化上下文。当调用transaction.commit()时,持久化上下文与数据库同步。

     

这种方法有各种优点:

     

您可以继续更新实体,并且使用单个数据库插入/更新来保留对Java对象的所有更改。   更新数据库表行会导致行锁定。在事务结束时仅在短时间内进行行锁定,可防止并发用户锁定或死锁情况。