所以我理解dynamic-update = true这个属性的设置是什么,即它只考虑那些被修改的字段,并省略了为其他字段设置空值的工作.节省开销,提高性能.
出于好奇心问:hibernate如何知道所有字段都被修改了?在触发更新查询之前,它是否首先将select查询生成的结果与数据库进行比较?假设是,那么不是比较性能的开销吗?
如我错了请纠正我.提前致谢!
我试图模仿这个已接受的答案 /sf/answers/2782285201/在仅更新某些对象的字段时使用 Hibernate 代理。我的代码如下所示:
@Transactional
public void updateStudentYear(int uniqueNumber, int newYear) {
Student studentProxy = studentRepository.getOne(uniqueNumber);
studentProxy.setYear(newYear);
studentRepository.save(studentProxy);
}
Run Code Online (Sandbox Code Playgroud)
问题在于 Hibernate 既执行完全选择又执行完全更新。这是日志:
2021-03-10 20:24:23.240 DEBUG 118757 --- [ main] org.hibernate.SQL :从学生中选择student0_.unique_number作为unique_n1_1_0_,student0_.name作为name2_1_0_,student0_.team作为team3_1_0_,student0_.year作为year4_1_0_ Student0_ 其中student0_.unique_number=?
2021-03-10 20:24:23.268 DEBUG 118757 --- [ main] org.hibernate.SQL : 更新学生集 name=?, team=?,year=? 其中 unique_number=?
我原以为只会发出一个“更新年份”语句,但令我惊讶的是,看起来一切都是像经典的 findOne()/save() 对操作一样完成的。我错了吗?