Spring数据JPA JpaRepository.save(Iterable..)-没有javax.validation?(实体上的注释未验证)
由于性能问题,我将for循环更改为: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
MyRepo myRepo; //MyRepo extends JpaRepository
for (final CSVRecord record : csvParser) {
...
myRepo.save(myEntity);
}
到
这是我在单次保存时得到的异常,但在列表保存时没有:
javax.validation.ConstraintViolationException:在组[javax.validation.groups.Default]的持续时间内,类[MyEntity]的验证失败,约束冲突列表:[ConstraintViolationImpl{InterpolatedMessage
详细信息
- for循环周围的方法被标记为
(无论如何保存。(Iterable更快)@Transactional
- 在单一保存变量中,我没有使用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;
}