如何解决如果实体中没有任何更改,Spring Data的save方法会更新数据库中的实体吗?
在编辑表单时,用户有时可能不会更改表单,而是仍然单击“提交”按钮。在下面的一种控制器方法中,即使用户未进行任何更改,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根本不会发布更新。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。