【问题标题】:Spring Data JPA JpaRepository.save(Iterable..) - no javax.validation? (Annotations at Entity not validated)Spring Data JPA JpaRepository.save(Iterable..) - 没有 javax.validation? (未验证实体的注释)
【发布时间】:2018-05-04 21:14:19
【问题描述】:

由于性能问题,我从以下位置更改了 for 循环:

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 秒
  • 可迭代保存变体 5 秒
  • 单次验证的可迭代保存 8 秒

【问题讨论】:

    标签: java hibernate spring-data spring-data-jpa bean-validation


    【解决方案1】:

    Iterable 上没有注释,因此验证不会检查下面的内容。

    同:

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

    如果您从 Person 端进行验证,它将不会验证 Child 类,除非您使用 @Valid 注释您的 child 字段。

    Iterable 没有javax.validation 注释,因此它的字段没有经过验证。

    但是,如果您在一个事务中执行此操作,那么通过验证一个一个地保存它应该不是问题。您也可以在保存前进行验证。

    【讨论】:

    • 谢谢。好的,所以我必须对每个 bean 使用我的解决方法和单一验证。对于@Valid,我必须先将所有内容包装在新对象中。
    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 2021-10-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2022-01-02
    • 2016-03-14
    • 2010-09-21
    相关资源
    最近更新 更多