【发布时间】:2017-08-04 00:49:44
【问题描述】:
在将 Hibernate 与 Spring Boot JPA 一起使用时,我注意到当尝试在扩展 Spring 的 CrudRepository 接口的存储库工件中实现更新方法时,必须将要更新的整个实体对象传递给这样的更新方法。直觉上这似乎很浪费,我想知道什么是让 Spring Data/JPA 假设只有那些传入的值需要更新而让那些没有传入的值保持不变的干净方法。
这是目前的服务方法,
public void updateCustomer(Long id, Customer customer) throws Exception {
customerRepository.save(customer);
}
【问题讨论】:
-
过早的优化是万恶之源。你为什么认为这是浪费...你将如何确定哪些字段发生了变化(让我猜猜,获取完整的对象,逐个字段比较并构造一个查询)试图弄清楚发生了什么变化而浪费的时间是可能更大,然后更新所有字段,更不用说增加的复杂性。如果您想要选择性更新,hibernate 已经支持它自己确定它(但如上所述选择性地使用)。更不用说您是否有更大的对象图(如地址、帐户等)。
-
他说得有道理!如果您只想更新一列,那么获取对象很浪费,对吧?不过,据我所知,使用 hibernate 时,您会求助于自定义查询。我最近刚刚看到一篇有趣的文章:blog.jooq.org/2017/03/08/… 尽管你可以反对过早的优化,但这绝对是正确的,最终可以为你节省很多钱来购买更大的数据库服务器。
-
为什么更新单个列或整个对象(或关系等)需要更大的数据库?您的数据量不会增加,因此不确定更大的数据库与更大的更新语句有何关系。通常,数据库(有时是您的持久性提供程序)足够聪明,可以进行各种优化,但在您搞砸选择性更新的那一刻就停止这样做。
标签: spring hibernate spring-boot spring-data spring-data-jpa