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