Yalnızca belirli alanları güncellemek için Spring boot JPA güncellemesi

0

Soru

Ben DB bir varlık güncelleme ile bu sorun ile karşılaştı. bütün bir varlığı geçerken ve yalnızca belirli alanları güncellerken, dokunulmamış alanları null olarak ele alır, sonuç olarak bu alanlar olduğu için bir istisna alırım @Not-Null,

Benzer sorunları aramayı denedim ancak sorunumu çözemedim.

Şirket KURULUŞU:

@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<>();
}

Çoğu alan şunlardır @NotNull bununla birlikte, oluşturmak için varlığı, bazen yalnızca belirli alanları güncellemem gerekiyor.

Hizmet:

@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";
}

gördüğünüz gibi bir ENTITY değiştirilmezse özniteliklerin geri kalanının otomatik olarak null olmasına neden olan geçirildi.

Denetleyici:

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

ÖZEL:

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}'}
]

Teşekkürler.

hibernate java jpa
2021-11-21 18:38:43
1

En iyi cevabı

0

Denetleyici, yeni bir Şirket varlığına aktardığınız değerleri bağlıyor. Yeni varlık kalıcılık bağlamına bağlı değildir, önceden var olan varlığın durumuna sahip değildir. Kaydettiğinizde JPA, değerleriniz olmayan tüm alanları geçersiz kılmak istediğinizi düşünüyor.

Bunun yerine, denetleyicinin bağımsız değişkenlerini bir DTO'YA bağlamasını sağlayabilirsiniz. Ardından hizmette findById kullanarak varolan Müşteriyi arar ve DTO'DAN varlığa güncelleştirilmesini istediğiniz alanları kopyalarsınız. Ardından, güncelleştirilmiş varlıkta geçen saveAndFlush öğesini çağırın.

DTO üzerinde bir gelişme var gibi görünüyor, iletilen güncellemeleri tutmak için ajsonpatch'i kullanabilirsiniz, bkz. https://www.baeldung.com/spring-rest-json-patch. Yama yöntemi, yaptığınız şey için daha iyi bir eşleşme gibi görünüyor.

Sunucuda önemli olan, kalıcılık bağlamına bağlı ve tüm alanları geçerli olan bir varlığa sahip olmanız için varolan varlığı aramaktır.

2021-11-21 20:00:13

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................