【发布时间】: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