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
详情
- 围绕 for 循环的方法被标记为
@Transactional
(无论如何保存。(Iterable 更快)
- 我没有在单一保存变体中使用冲洗或其他任何东西
问题
save(Iterable)
未进行验证是否有原因?
我目前的解决方法
手动调用验证但感觉不对:
Set<ConstraintViolation<MyEntity>> violations = validator.validate(myEntity);
if (violations.size() > 0) {throw new ConstraintViolationException(violations);}
好吧,我的时间利润现在也变小了,但没关系,没有什么是免费的;-)。
- 单个保存变体13秒
- 可迭代保存变体 5 秒
- 可迭代保存,单次验证 8 秒
您在 Iterable
上没有注释,因此验证不会检查下面的内容。
同于:
class Person {
Child child;
}
class Child {
@Max(18)
Integer age;
}
如果您将从 Person
方面进行验证,它将不会验证 Child
类,除非您将使用 @Valid
注释您的 child
字段。
Iterable
没有 javax.validation
注释,因此它的字段未经过验证。
但是,如果您在一次交易中执行此操作,那么通过验证将其逐一保存应该不是问题。您也可以在保存前进行验证。
由于性能问题,我更改了一个 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 秒
您在 Iterable
上没有注释,因此验证不会检查下面的内容。
同于:
class Person {
Child child;
}
class Child {
@Max(18)
Integer age;
}
如果您将从 Person
方面进行验证,它将不会验证 Child
类,除非您将使用 @Valid
注释您的 child
字段。
Iterable
没有 javax.validation
注释,因此它的字段未经过验证。
但是,如果您在一次交易中执行此操作,那么通过验证将其逐一保存应该不是问题。您也可以在保存前进行验证。