스프링 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
'programing' 카테고리의 다른 글
열려는 파일이 As에서 파일 확장명으로 지정된 형식과 다릅니다.그물 (0) | 2023.07.15 |
---|---|
"R" 재료를 검색하는 방법은 무엇입니까? (0) | 2023.07.15 |
하나의 서버에 있는 두 개의 서로 다른 데이터베이스에 있는 테이블 간에 INER JOIN을 사용하여 쿼리 업데이트 (0) | 2023.07.15 |
요일 찾기 (0) | 2023.07.15 |
HTML에서 Excel로:Excel에 열을 숫자로 처리하도록 지시하는 방법은 무엇입니까? (0) | 2023.07.15 |