Spring 数据 JPA JpaRepository.save(可迭代..)- 否 javax.validation? (实体的注释未验证)

Spring Data JPA JpaRepository.save(Iterable..) - no javax.validation? (Annotations at Entity not validated)

由于性能问题,我更改了一个 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

详情

问题

save(Iterable) 未进行验证是否有原因?

我目前的解决方法

手动调用验证但感觉不对:

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

好吧,我的时间利润现在也变小了,但没关系,没有什么是免费的;-)。

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

同于:

class Person {

    Child child;

}

class Child {

    @Max(18)
    Integer age;

}

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

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

但是,如果您在一次交易中执行此操作,那么通过验证将其逐一保存应该不是问题。您也可以在保存前进行验证。