Определение длины строки заранее

1

Я использую Hibernate для сохранения данных, декодированных из входных файлов. Поскольку один из наших форматов имеет формат переменной длины, я хотел бы легко проверить возможные ошибки в вставке в сущности до того, как транзакция будет совершена, поэтому я могу обрабатывать исключения и предпринимать соответствующие действия.

Если у меня есть сущность

@Entity
public class Entity {

    @Column(...,length=20)
    private String col1;

    @Column(...,length=20)
    private String col2;

    @Column(...,length=40)
    private String col3;

    ...

    @Column(...,length=100)
    private String col..N;

}

Я хотел бы определить, является ли String установленным как значение для каждого столбца, совместимым с его длиной, возможно, без инструментария Java-кода для проверки каждого поля с максимальной длиной.

В настоящее время я получаю исключение SQL только при совершении транзакции (т. @Transactional Метод @Transactional возвращает) для всей партии, когда проблема затрагивает только одну запись. Захват исключения, когда я Session.persist(entity) будет заметным.

Есть идеи?

Теги:
hibernate

2 ответа

4
Лучший ответ

Поскольку вы уже используете Hibernate, вы считали Hibernate Validator? Это выглядело бы примерно так

@Size(max = 20)
@Column(...,length=20)
private String col1;

// and validation itself
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
Set<ConstraintViolation<Entity>> constraintViolations = validator.validate(entity);

Недостатком является то, что вам придется использовать другой набор аннотаций рядом с @Column, но, с другой стороны, он предлагает гораздо больше опций.

Другой вариант - использовать аспекты и перехватывать каждый сеттер для полей String в классах, аннотированных с @Entity. В этом аспекте вы получите аннотацию @Column и сравните длину параметра с настроенным атрибутом lenght n аннотации.

  • 0
    Проверка может быть успешно выполнена в методе Lifecycle.onSave, который должен вызвать CallbackException, если проверка не удалась
0

Вы можете использовать специальный перехватчик для обрезки строк, как предлагается здесь: правильная обработка длинных данных в спящем режиме

или, может быть, использовать аннотацию длины и собственный валидатор длины, как предлагается здесь: hibernate validator LengthValidator усеченной строки

  • 0
    На самом деле мне нужно генерировать исключение, а не усекать. Таким образом, пользователь информируется об обстоятельствах

Ещё вопросы

Сообщество Overcoder
Наверх
Меню