Spring CrudRepository Сохранить для обновления переопределяет другие поля - PullRequest
0 голосов
/ 29 мая 2018

Я использую CrudRepository для операций с базами данных в моем проекте.Когда я обновляю постоянные данные с помощью метода сохранения, который реализован Spring, другие поля переопределяются.Например, я отправляю только firstName для обновления, но lastName преобразуется в пустое поле.

Я просто вызываю метод save с таким объектом:

memberRepository.save(memberForUpdate);

Я отправляю этот JSON для обновления метода:

{"id":2,"firstName": "Rubens","lastName": "Barichello"}

Преобразование Springэтот JSON для Member в конечной точке остальных 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;
    }
}

Как я могу предотвратить переопределение других полей и обеспечить обновление только отправленных полей?

1 Ответ

0 голосов
/ 29 мая 2018

Сам метод сохранения ведет себя как saveorUpdate, поэтому проблема здесь в вашем коде.

То, что вы делаете, это только устанавливаете значения некоторых значений, а не другие значения.Поэтому, когда вы отправляете частичную JSON для Spring, он устанавливает другие значения в их значения по умолчанию.Теперь проблема здесь, нулевое допустимое значение в базе данных.Таким образом, CrudRepository обновляет все значения вместе с нулевым значением, так как считает, что вы хотите обновить базу данных со значениями в объекте.Рассмотрим ваш сценарий здесь:

Json, отправленный в Spring: {"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 id), установите значения и затем вызовите метод сохранения (S-сущность).

Например.

memberfromspring;
memberforupdate= memberRepository.findById(memberfromspring.getId());
memberforupdate.setFirstName(memberfromspring.getFirstName());
memberforupdate.setLastName(memberfromspring.getLastName());
memberRepository.save(memberForUpdate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...