Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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
将Spring数据';s save()方法是否在实体没有更改的情况下更新数据库中的实体?_Spring_Hibernate_Spring Data Jpa_Spring Data_Hibernate Mapping - Fatal编程技术网

将Spring数据';s save()方法是否在实体没有更改的情况下更新数据库中的实体?

将Spring数据';s save()方法是否在实体没有更改的情况下更新数据库中的实体?,spring,hibernate,spring-data-jpa,spring-data,hibernate-mapping,Spring,Hibernate,Spring Data Jpa,Spring Data,Hibernate Mapping,编辑表单时,用户有时可能不会更改表单,但仍会单击“提交”按钮。在下面的一个控制器方法中,save()方法是否会执行对数据库的查询并更新字段,即使用户没有更改任何内容 PostMapping("/edit_entry/{entryId}") public String update_entry( @PathVariable("entryId") Long entryId, @RequestParam String title,

编辑表单时,用户有时可能不会更改表单,但仍会单击“提交”按钮。在下面的一个控制器方法中,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";
}

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

调用
save(…)
时到底发生了什么取决于下面的持久化技术。基本上有两类实现:

  • 主动管理实体的实施。这方面的例子有JPA和Neo4j。这些实现跟踪从存储返回的实体,因此能够首先检测更改。您为此付出了额外的复杂性,因为实体通常以某种方式进行检测,而且即使最终没有检测到任何更改,更改检测当然也需要时间。从好的方面来说,只有在需要时才会更新触发器

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


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

    entryRepo是否扩展了JpaRepository或Crudepository?
    entryRepo
    扩展了Crudepository。如果没有任何更改,则不进行更新,jpa将阻止它,并且不会发出语句(除非您有一些动态计算的字段,如上次更新的时间戳)。此外,您使用的
    可选
    方式也不正确。不要使用
    get
    (如果找不到它将失败),而是使用
    map
    。@M.Deinum谢谢!我肯定会考虑使用<代码> map <代码>而不是“获取”!因此,在我看来,谈论第一类实现时,“if”语句不会使过程更快,因为行
    this.entryRepo.save(entry)仍将执行…但如果我添加一个布尔变量,如
    boolean changed=false位于一系列“if”语句的正上方,以便在字段被更改的“if”块中将变量转换为
    true
    ,然后我包装
    this.entryRepo.save(条目)
    如果
    changed
    变量保持
    true
    值(即注意到一些更改),将执行的“if”块中,检测更改是否会更快,或者这些“if”语句的存在是否毫无用处?