programing

스프링 JPA:데이터를 손실하지 않고 전환하는 방법

goodsources 2023. 7. 15. 10:04
반응형

스프링 JPA:데이터를 손실하지 않고 전환하는 방법

새 레코드가 없으면 삽입하고 오래된 데이터를 잃지 않고 레코드가 있으면 업데이트할 수 있는 방법이 있습니까?

서비스 계층 방법은 다음과 같습니다.

public void saveSample(Sample sample) {
    Sample samplePersistent = sample;

    if (sample.getId() != null) {
        samplePersistent = sampleRepository.findOne(sample.getId());
        Assert.notNull(samplePersistent, "Sample entity not found with id : " + sample.getId());

        samplePersistent.setLocation(sample.getLocation());
        samplePersistent.setName(sample.getName());
        samplePersistent.setType(sample.getType());
        ...
        ...

    }

    samplePersistent.cloneAuditingInfoFrom(sample);
    sampleRepository.save(sample);
}

저는 이것이 쓸모없는 방법이라고 생각합니다.

SpringBeanUtils Class 또는 @DynamicUpdate Annotation으로 문제를 해결할 수 있습니까?

이미 Spring 및 Spring-Data-JPA 호출을 사용하고 있는 경우sampleRepository.save(sample);저장 방법은 먼저 전달된 엔티티가 새 엔티티인지 아니면 엔티티의 ID 값을 기반으로 기존 엔티티인지 확인합니다.ID는 엔티티의 기본 키로 정의됩니다.

EntityManager#merge 메서드를 사용할 수도 있습니다.그러나 이미 Spring Data를 사용하고 있으므로 save 메서드는 내부적으로 병합 메서드를 호출합니다.

제 생각에 당신은 사용할 필요가 없습니다.@DynamicUpdate업데이트할 필드가 너무 많지만 실제로 업데이트되는 필드는 거의 없고 다른 테이블과 관련하여 많은 제약 조건이 있는 경우는 제외합니다.

Spring BeanUtils는 객체 지속성과 아무런 관련이 없습니다.주로 속성 복사, 빈 방법 찾기, 속성 설명자 가져오기 등 자바빈 특정 작업을 수행하는 것을 목표로 합니다.

추신: 그래서 당신은 확인할 필요가 없습니다.sample.getId()null이거나 그렇지 않은 경우 DB에서 레코드를 가져옵니다.findOne방법.그냥 지나침sampleRepository.save(sample)레코드를 저장/업데이트합니다.

@DynamicUpdate 대신 upsert를 선호합니다.DynamicUpdate는 여러 요청이 동시에 발생할 경우 성능 오버헤드와 잠금 문제가 함께 제공됩니다.

언급URL : https://stackoverflow.com/questions/36241163/spring-jpa-how-to-upsert-without-losing-data

반응형