Я думал, что валидаторы будут работать автоматически. Что я делаю
здесь не так?
Вы сохраняете сущность, но не очищаете состояние текущего менеджера сущности.
Таким образом, проверка сущности еще не выполнена.
Вы можете обратиться к FAQ по валидатору Hibernate :
Почему моя сущность JPA не проверяется, когда я вызываю persist ()?
Почему моя сущность JPA не проверяется, когда я звоню persist()
? Короткая
ответ на звонок EntityManager#flush()
, если вы хотите, чтобы проверка была
срабатывает.
Hibernate ORM и несколько других ORM пытаются объединить столько операций, сколько
возможно при доступе к базе данных. Вполне вероятно, что фактическое
«персистентная» операция сущности происходит только когда вы звоните flush()
или когда
транзакция совершается.
Кроме того, знание того, какая сущность собирается сохраниться, зависит от вашего
каскадная стратегия и состояние вашего объекта графа. Флеш это когда
Hibernate ORM идентифицирует все объекты, которые были изменены, и
требовать действий с базой данных (см. также HHH-8028).
Поэтому используйте JpaRepository.saveAndFlush()
вместо JpaRepository.save()
, чтобы разрешить проверку сущности.
Или, альтернативно, введите EntityManager
или TestEntityManager
в тестовый класс, вызовите JpaRepository.save()
, а затем вызовите EntityManager/TestEntityManager.flush()
.
Для информации:
JpaRepository.save()
вызывает em.persist(entity)
/ em.merge(entity)
JpaRepository.saveAndFlush()
вызывает JpaRepository.save()
, а затем em.flush()
Чтобы иметь возможность вызывать saveAndFlush()
, вы должны сделать свой интерфейс репозитория расширенным JpaRepository
, например:
public interface AuditEventRepository extends JpaRepository<AuditEventEntity, UUID> {
Поскольку JpaRepository
расширяет PagingAndSortingRepository
, это изменение остается в соответствии с вашей существующей декларацией.
Я бы добавил, что это утверждение не требуется:
assertThat(saved.getLabel()).isNotNull();
То, что вы хотите утверждать, это то, что ValidationException
выбрасывается и, возможно, содержит фактическое сообщение об ошибке.