2017-11-21 21 views
1

내가에서 루프를 변경 (법인의 주석이 확인되지 않음) :스프링 데이터 JPA JpaRepository.save (Iterable ..) - 아니요 javax.validation? 때문에 성능 문제의

MyRepo myRepo; //MyRepo extends JpaRepository 
for (final CSVRecord record : csvParser) { 
    ... 
    myRepo.save(myEntity); 
} 

ArrayList<MyEntity> allMyEntities = new ArrayList<>(); 
for (final CSVRecord record : csvParser) { 
    ... 
    allMyEntities.add(myEntity); 
} 
myRepo.save(allMyEntities); //save(Iterable<S> entities); 

그래서 성능이었다 더 나은 예상하지만 예외를 예상하기 때문에 내 테스트가 실패로 엔티티 @Pattern 검증 (ConstraintViolationException) :

@Table 
public class MyEntity{ 
    @Pattern(regexp = 'whatever') 
    private String checkMe 
} 

이 내가가있어 예외는 javax.validation.ConstraintViolationException: Validation failed for classes [MyEntity] during persist time for groups [javax.validation.groups.Default, ] List of constraint violations:[ ConstraintViolationImpl{interpolatedMessag

정보를 for 루프가 저장 어쨌든 (@Transactional로 표시되어 주위

  • 방법 (Iterable을 빨리했다)
  • 내가 사용하지 않았다. 저장 있지만 목록에 저장 한 플러시 또는 하나에서 다른 어떤 저장 변형

질문

save(Iterable)에 대한 유효성 검사가 수행되지 않는 이유가 있습니까?

나의 현재 해결 방법

전화 손으로 검증 그러나 이것은 잘못된 느낌은 :

Set<ConstraintViolation<MyEntity>> violations = validator.validate(myEntity); 
if (violations.size() > 0) {throw new ConstraintViolationException(violations);} 

좋아, 내 시간의 이익은 이제 작지만 확인, 아무것도 ;-) 무료입니다.

  • 단일 저장 변형 13초

답변

1

당신은 너무 검증이 무엇인지 확인하지 않습니다 Iterable에 주석이없는 하나의 검증에 저장 팔초 반복 가능한 변형 5 sedonds

  • 을 저장 반복 가능한 아래에. 당신이 Person 측면에서 검증하는 경우 @Validchild 필드에 주석을하지 않는 한

    class Person { 
    
        Child child; 
    
    } 
    
    class Child { 
    
        @Max(18) 
        Integer age; 
    
    } 
    

    , 그것은 Child 클래스를 확인하지 않습니다으로

    동일합니다.

    Iterable에는 javax.validation 주석이 없으므로 필드의 유효성을 검사하지 않습니다.

    그러나 하나의 트랜잭션에서 수행하는 경우 유효성 검사를 통해 하나씩 저장하는 것이 좋습니다. 저장하기 전에 유효성을 검사 할 수도 있습니다.

  • +0

    감사합니다. Ok. 그래서 나는 모든 빈에 대한 나의 해결 방법과 단일 검증을해야만한다. '@ Valid'를 사용하면 먼저 새로운 객체를 모두 래핑해야합니다. – timguy