簡體   English   中英

Spring 啟動 JPA 更新僅更新特定字段

[英]Spring boot JPA update to update only specific fields

所以我在更新數據庫中的實體時遇到了這個問題。 在傳遞整個實體並僅更新特定字段時,它將未觸及的字段視為 null,因此我得到一個異常,因為這些字段是@Not-Null

我曾嘗試尋找類似的問題,但無法解決我的問題。

公司實體:

@Entity
@Table (name = "companies")
@Data
@ToString(exclude = "perfumes")
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @NotNull
    private String name;

    @NotNull
    @Email(message = "Wrong input. please enter a VALID email address")
    private String email;

    @NotNull
    @Size(min = 4, max = 14, message = "Password range must be between 4 - 14 digits")
    private String password;

    @NotNull
    @Enumerated(EnumType.STRING)
    private Country country;

    @Singular
    @OneToMany(mappedBy = "company", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Perfume> perfumes = new ArrayList<>();
}

大多數字段都是@NotNull用於創建,但是,我需要更新實體,有時只更新特定字段。

服務:

@Override
public String updateCompany(int id, Company company) throws DoesNotExistException {
    if(!companyRepository.existsById(id))
    {
        throw new DoesNotExistException(id);
    }

    companyRepository.saveAndFlush(company);
    return company.getName() + " has been UPDATED";
}

如您所見,已傳遞一個ENTITY ,如果未修改,則會導致屬性的 rest 自動為 null。

Controller:

  @PutMapping("/updateCompany/{id}")
    @ResponseStatus(HttpStatus.ACCEPTED)
    public String updateCompany(@PathVariable int id, @RequestBody Company company) throws DoesNotExistException {
        return admin.updateCompany(id,company);
    }

例外:

Validation failed for classes [com.golden.scent.beans.Company] during update time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='must not be null', propertyPath=password, rootBeanClass=class com.golden.scent.beans.Company, messageTemplate='{javax.validation.constraints.NotNull.message}'}
]

謝謝。

controller 將您傳入的值綁定到新的公司實體。 新實體未附加到持久性上下文,它沒有預先存在的實體的 state。 當您保存它時 JPA 認為您想要 null 出所有您沒有值的字段。

相反,您可以讓 controller 將其 arguments 綁定到 DTO。 然后在服務中使用 findById 查找現有客戶,並將要更新的字段從 DTO 復制到實體。 然后調用 saveAndFlush 傳入更新的實體。

看起來比 DTO 有所改進,你可以使用 aJsonPatch 來保存傳入的更新,請參閱https://www.baeldung.com/spring-rest-json-patch在服務器上重要的是查找現有實體,以便您擁有一個附加到持久性上下文並使其所有字段都處於當前狀態的實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM