Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate是否检查对象是否已实际更改,或者是否假定已调用setter?_Java_Hibernate - Fatal编程技术网

Java hibernate是否检查对象是否已实际更改,或者是否假定已调用setter?

Java hibernate是否检查对象是否已实际更改,或者是否假定已调用setter?,java,hibernate,Java,Hibernate,我正在使用Hibernate和Spring框架,并且遇到了一个机会主义锁定,所以我有一个基本问题: Hibernate在调用它的SETTER时就考虑对象“改变/肮脏”,例如: SeaMe.StAGE(32)< /代码>,因此即使年龄< /代码>已经 32 /代码>,它将被认为是“被改变的”,或者Hibernate会得出这样的结论:即使SETER被调用,对象也有效地没有改变吗 换句话说,如果我想防止不必要的写入,是否有必要编写代码: if (theEmployee.getAge() != age

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

Hibernate在调用它的SETTER时就考虑对象“改变/肮脏”,例如:<代码> SeaMe.StAGE(32)< /代码>,因此即使<代码>年龄< /代码>已经<代码> 32 /代码>,它将被认为是“被改变的”,或者Hibernate会得出这样的结论:即使SETER被调用,对象也有效地没有改变吗

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

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

…或者只需编码:
theEmployee.setAge(年龄)

您可以非常轻松地测试它。但答案是Hibernate测试对象的实际状态。如果对象状态与加载时相同,则不会执行任何更新查询。

您可以非常轻松地测试这一点。但答案是Hibernate测试对象的实际状态。如果对象状态与加载时相同,则它不会执行任何更新查询。

框架(Hibernate)会“找出”并且不会在数据库中执行任何操作-我不得不说,这非常棒。

框架(Hibernate)会“找出”并且不会执行任何操作在数据库中-我不得不说这太棒了。

如果对象中有任何更改,那么在hibernate中只调用更新查询。您可以在此处详细查看以了解对象的状态:

从上面的链接可以看到:

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

这种方法有多种优点:

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


如果对象中有任何更改,那么在hibernate中只调用更新查询。您可以在此处详细查看以了解对象的状态:

从上面的链接可以看到:

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

这种方法有多种优点:

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


我说的对吗,hibernate在调用
EntityManager.merge()
时检查对象状态,而不是在调用
setter
方法时检查对象状态?不对。hibernate需要刷新会话时检查状态。我想这称为“脏检查”:)我说的对吗,hibernate在调用
EntityManager.merge()
时检查对象状态,而不是在调用
setter
方法时检查对象状态?否。在hibernate需要刷新会话时检查状态。我想它被称为“脏检查”:)检查此链接以获取详细解释检查此链接以获取详细解释