如果实体没有变化,Spring Data的save()方法会更新数据库中的实体吗?

Dan*_*lWH 5 spring hibernate hibernate-mapping spring-data spring-data-jpa

在编辑表单时,用户有时可能不更改表单而仍然单击提交按钮。在下面的控制器方法之一中,即使用户没有更改任何内容,save() 方法也会对数据库执行查询并更新字段吗?

PostMapping("/edit_entry/{entryId}")
public String update_entry(
        @PathVariable("entryId") Long entryId,
        @RequestParam String title,
        @RequestParam String text
) {
    Entry entry = this.entryRepo.findById(entryId).get();
    
    if (!entry.getTitle().equals(title))
        entry.setTitle(title);
    if (!entry.getText().equals(text))
        entry.setText(text);
        
    this.entryRepo.save(entry);
        
    return "redirect:/entries";
}
Run Code Online (Sandbox Code Playgroud)

另外,在这种情况下“if”语句是否必要?

Oli*_*ohm 6

调用期间到底发生了什么save(\xe2\x80\xa6)取决于底层的持久性技术。基本上有两类实现:

\n
    \n
  1. 主动管理实体的实现。JPA 和 Neo4j 就是这样的例子。这些实现跟踪从商店返回的实体,因此能够首先检测到更改。您为此付出了额外的复杂性,因为实体通常以某种方式进行检测,并且更改检测当然也需要时间,即使它最终没有检测到任何更改。从好的方面来说,如果需要的话,唯一的触发器会更新。

    \n
  2. \n
  3. 主动管理实体的实现。示例包括 JDBC 和 MongoDB。这些实现不会跟踪从数据存储加载的实体,因此不会对它们进行检测。这也意味着无法检测更改,因为所有实现看到的都是一个没有任何进一步上下文的实体实例。

    \n
  4. \n
\n

在您的具体示例中,如果请求参数不包含不同的值,MongoDB 实现仍然会发出更新,而 JPA 根本不会发出更新。

\n