Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
Java Spring crudepository Save For Update覆盖其他字段_Java_Spring_Spring Boot_Spring Data - Fatal编程技术网

Java Spring crudepository Save For Update覆盖其他字段

Java Spring crudepository Save For Update覆盖其他字段,java,spring,spring-boot,spring-data,Java,Spring,Spring Boot,Spring Data,我在我的项目中使用crudepository进行数据库操作。当我用Spring实现的save方法更新持久化数据时,其他字段被覆盖。例如,我只发送firstName进行更新,但lastName被转换为空字段 简单地说,我使用如下实体调用save方法: memberRepository.save(memberForUpdate); 我将此JSON发送到更新方法: {"id":2,"firstName": "Rubens","lastName": "Barichello"} Spring将此JSO

我在我的项目中使用crudepository进行数据库操作。当我用Spring实现的save方法更新持久化数据时,其他字段被覆盖。例如,我只发送firstName进行更新,但lastName被转换为空字段

简单地说,我使用如下实体调用save方法:

memberRepository.save(memberForUpdate);
我将此JSON发送到更新方法:

{"id":2,"firstName": "Rubens","lastName": "Barichello"}
Spring将此JSON转换为RESTAPI端点处的成员。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方法本身的行为类似于saveorUpdate,因此这里的问题在于您的代码

您所做的只是设置一些值,而不是其他值。因此,当您向spring发送部分json时,它会将其他值设置为默认值。现在的问题是,null是数据库中的有效值。因此,Crudepository正在更新所有值以及null值,因为它认为您希望使用对象中的值更新数据库。考虑一下你的场景:

发送给Spring的Json:
{“id”:2,“firstName”:“Rubens”,“lastName”:“Barichello”}

Spring生成的对象:

private long id=2;
private String firstName="Rubens";
private String lastName="Barichello";
private String email=null;
private boolean enabled=false;
private String password=null;
private String memberLanguageCode=null;
private String activationToken=null;
private LocalDateTime activationTokenExpDate=null;
因此,您应该使用findById(ID)方法获取对象,设置值,然后调用save(S entity)方法

例如


通过检索实体,更新修改的字段,然后保存实体。当您调用.save(object)时,整个对象被持久化,没有“魔力”。您必须手动处理它以部分更新现有的ObjectObject,但是,当我提供要保存的id时,它是否应该更新持久化的数据?我无法理解为什么它的行为像是坚持而不是更新。他怎么知道哪个领域需要更新?基于什么?没有魔法。框架无法猜测需要更新的内容,您可能希望更新文档以推送null
memberfromspring;
memberforupdate= memberRepository.findById(memberfromspring.getId());
memberforupdate.setFirstName(memberfromspring.getFirstName());
memberforupdate.setLastName(memberfromspring.getLastName());
memberRepository.save(memberForUpdate);