Spring数据JPA JpaRepository.save(Iterable..)-没有javax.validation?(实体上的注释未验证)

Spring数据JPA JpaRepository.save(Iterable..)-没有javax.validation?(实体上的注释未验证),java,hibernate,spring-data,spring-data-jpa,bean-validation,Java,Hibernate,Spring Data,Spring Data Jpa,Bean Validation,由于性能问题,我将for循环更改为: MyRepo myRepo; //MyRepo extends JpaRepository for (final CSVRecord record : csvParser) { ... myRepo.save(myEntity); } 到 这是我在单次保存时得到的异常,但在列表保存时没有: javax.validation.ConstraintViolationException:在组[javax.validation.groups.Def

由于性能问题,我将for循环更改为:

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

这是我在单次保存时得到的异常,但在列表保存时没有:
javax.validation.ConstraintViolationException:在组[javax.validation.groups.Default]的持续时间内,类[MyEntity]的验证失败,约束冲突列表:[ConstraintViolationImpl{InterpolatedMessage

详细信息

  • for循环周围的方法被标记为
    @Transactional
    (无论如何保存。(Iterable更快)
  • 在单一保存变量中,我没有使用flush或其他任何东西
问题

对于
save(Iterable)
,没有进行验证的原因是什么

我当前的解决方案

手动调用验证,但感觉有误:

Set<ConstraintViolation<MyEntity>> violations = validator.validate(myEntity);
if (violations.size() > 0) {throw new ConstraintViolationException(violations);}
设置冲突=validator.validate(myEntity);
如果(inflictions.size()>0){抛出新的ConstraintViolationException(inflictions);}
好的,我的时间利润现在也小了,但是好的,没有什么是免费的;-)

  • 单保存变量13秒
  • iterable save variant 5 sedonds
  • iterable保存,单次验证8秒

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

同:

class Person {

    Child child;

}

class Child {

    @Max(18)
    Integer age;

}
如果您将从
Person
侧进行验证,则不会验证
子类
类,除非您将
子类
字段注释为
@Valid

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


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

谢谢。好的,因此我必须对每个bean进行解决方法和单次验证。使用
@Valid
我必须首先将所有内容包装到新对象中。
Set<ConstraintViolation<MyEntity>> violations = validator.validate(myEntity);
if (violations.size() > 0) {throw new ConstraintViolationException(violations);}
class Person {

    Child child;

}

class Child {

    @Max(18)
    Integer age;

}