Проверить сущность, не сохраняя ее

Либо используйте globstar вашей оболочки (который выполняет рекурсивный поиск) 1,2:

shopt -s globstar 
git diff -- *.py **/*.py
, либо используйте find:
find -name '*.py' -print0 | xargs -0 git diff --
Оба они являются специальными именами и пробелами. Хотя вы можете захотеть отфильтровать каталоги с расширением .py :) 1 Мне нравится делать git diff -- {.,**}/*.py обычно 2 Когда globstar включен, git diff -- **/*.py уже включает ./*.py. В man-странице Bash: «Если за ним следует /, два соседних * s будут соответствовать только каталогам и подкаталогам».

1
задан talex 20 March 2019 в 04:26
поделиться

3 ответа

@Column имеет атрибут length, который можно использовать для установки длины столбца, это приведет к исключению SQL при вставке значения большей длины. И вы можете использовать @Size(max=SOME_VALUE) для проверки бина.

@Entity
public class MyEntity {

    @Size(max=10)
    @Column(name = "field", nullable = false, length = 10)
    private String field;
}
0
ответ дан Thanthu 20 March 2019 в 04:26
поделиться

Я создал небольшой служебный класс, чтобы решить именно эту проблему.

public class HibernateValidator {

    private ConcurrentHashMap<Class, List<FieldConstraint>> constraints = new ConcurrentHashMap<>();

    public List<ValidationViolation> validate(Object entity) {
        List<FieldConstraint> constraints = getFieldConstraints(entity);

        return constraints.stream()
                .flatMap(x -> validate(entity, x))
                .collect(Collectors.toList());
    }

    private Stream<ValidationViolation> validate(Object entity, FieldConstraint x) {
        String value;
        try {
            x.getField().setAccessible(true);
            value = (String) x.getField().get(entity);
        } catch (IllegalAccessException e) {
            throw new RuntimeException("Can't get value", e);
        }
        if (value != null && value.length() > x.getSize()) {
            return Stream.of(ValidationViolation.builder()
                    .fieldName(x.getField().getName())
                    .build());
        } else {
            return Stream.empty();
        }
    }

    private List<FieldConstraint> getFieldConstraints(Object entity) {
        return constraints.computeIfAbsent(entity.getClass(),
                clazz -> Stream.of(clazz.getDeclaredFields())
                        .filter(x -> x.getType().equals(String.class))
                        .flatMap(x -> {
                            Column annotation = x.getAnnotation(Column.class);
                            if (annotation == null) {
                                return Stream.empty();
                            } else {
                                return Stream.of(FieldConstraint.builder()
                                        .field(x)
                                        .size(annotation.length())
                                        .build());
                            }
                        })
                        .collect(Collectors.toList()));
    }

    @Data
    @Builder
    public static class ValidationViolation {
        private final String fieldName;
    }

    @Data
    @Builder
    private static class FieldConstraint {
        private final Field field;
        private final int size;
    }
}
0
ответ дан talex 20 March 2019 в 04:26
поделиться

Используйте валидацию bean-компонента :

@Entity
public class MyEntity {

    @Size(max = 10)
    @Column(name = "field", nullable = false, length = 10)
    private String field;
}

Или можно использовать аннотации, специфичные для спящего режима @Length(max = 10).

Затем вы можете проверить сущность с помощью объекта validator :

public class DemoApplication {

    public static void main(String[] args) {

        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        MyEntity myEntity = new MyEntity();
        Set<ConstraintViolation<MyEntity>> constraintViolations = validator.validate(myEntity));
    }
}
0
ответ дан Mikhail Ilinykh 20 March 2019 в 04:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: