Уникальное ограничение с JPA и валидацией бина

Я хотел бы иметь ограничение @Unique с проверкой бина, но это не предусмотрено стандартом. Если бы я использовал JPA @UniqueConstraint , у меня не было бы уникального механизма проверки и сообщения об ошибках.

Есть ли способ определить @Unique как ограничение проверки бинов и объединить это с JPA, так что JPA создает столбец с уникальным ограничением и проверяет, является ли значение уникальным или нет?

37
задан deamon 16 August 2010 в 16:53
поделиться

2 ответа

Если вы не приобретете блокировку на всю таблицу, проверка на единство с помощью SQL-запроса в принципе невозможна (любая параллельная транзакция может изменить данные после ручной проверки, но до фиксации текущей транзакции). Другими словами, невозможно реализовать проверку на уникальность на уровне Java и, таким образом, обеспечить реализацию валидации. Единственный надежный способ проверки на уникальность - во время фиксации транзакции.

Спецификация BV резюмирует это следующим образом:

Приложение D. Интеграция Java Persistence 2.0

Вопрос: следует ли нам добавить @Unique, который будет отображаться на @Column(unique=true)?

@Unique не может быть протестирован на уровне Java но может генерировать генерацию уникального ограничения базы данных. @Unique не является частью спецификации BV сегодня.

Поэтому, хотя я согласен, что было бы неплохо, чтобы нарушения уникальных (и не нулевых) ограничений были обернуты в исключение Bean Validation, в настоящее время это не так.

Ссылки

50
ответ дан 27 November 2019 в 04:45
поделиться

Что ж, вы МОЖЕТЕ это сделать, но это нетривиально. Проблема в том, что валидатору требуется доступ к базе данных для выполнения некоторых запросов, чтобы проверить, есть ли значение, которое вы хотите вставить, уже там или нет. И это невозможно сделать с помощью валидатора, так как у него нет доступа к sessionFactory / session. Конечно, вы можете создать его экземпляр (session / sessionFactory) внутри валидатора, но это не очень хорошая практика кодирования.

3
ответ дан 27 November 2019 в 04:45
поделиться
Другие вопросы по тегам:

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