Я использую 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, вы считали 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 аннотации.
Вы можете использовать специальный перехватчик для обрезки строк, как предлагается здесь: правильная обработка длинных данных в спящем режиме
или, может быть, использовать аннотацию длины и собственный валидатор длины, как предлагается здесь: hibernate validator LengthValidator усеченной строки