【发布时间】:2018-05-29 08:41:34
【问题描述】:
我在我的项目中使用 CrudRepository 进行数据库操作。当我使用 Spring 实现的保存方法更新持久数据时,其他字段将被覆盖。例如,我只发送 firstName 进行更新,但 lastName 被转换为空字段。
简单地说,我用这样的实体调用 save 方法:
memberRepository.save(memberForUpdate);
我正在发送这个 JSON 来更新方法:
{"id":2,"firstName": "Rubens","lastName": "Barichello"}
Spring 将此 JSON 转换为其余 API 端点的成员。 Member.java 是:
package com.ilkaygunel.entities;
import java.time.LocalDateTime;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@Entity
@JsonInclude(Include.NON_NULL)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String firstName;
private String lastName;
private String email;
private boolean enabled;
private String password;
private String memberLanguageCode;
private String activationToken;
private LocalDateTime activationTokenExpDate;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id")
private MemberRoles roleOfMember;
@Override
public String toString() {
return String.format("Member [id=%d, firstName='%s', lastName='%s', email='%s']", id, firstName, lastName,
email);
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public MemberRoles getRoleOfMember() {
return roleOfMember;
}
public void setRoleOfMember(MemberRoles roleOfMember) {
this.roleOfMember = roleOfMember;
}
public String getActivationToken() {
return activationToken;
}
public void setActivationToken(String activationToken) {
this.activationToken = activationToken;
}
public LocalDateTime getActivationTokenExpDate() {
return activationTokenExpDate;
}
public void setActivationTokenExpDate(LocalDateTime activationTokenExpDate) {
this.activationTokenExpDate = activationTokenExpDate;
}
public String getMemberLanguageCode() {
return memberLanguageCode;
}
public void setMemberLanguageCode(String memberLanguageCode) {
this.memberLanguageCode = memberLanguageCode;
}
}
如何防止覆盖其他字段并仅提供更新已发送的字段?
【问题讨论】:
-
通过检索实体,更新修改的字段,然后保存实体。
-
当你调用 .save(object) 时,整个对象都被持久化了,没有“魔法”。您必须手动处理它才能部分更新现有对象
-
但是,当我给一个 id 来保存时,它应该更新持久化的数据吗?我无法理解为什么它的行为像持久化而不是更新。
-
他怎么知道哪个字段需要更新?基于什么 ?没有魔法。框架猜不出需要更新什么,你可能想更新文档推送null
标签: java spring spring-boot spring-data