Подтвердить что ты не робот

Уникальное ограничение с JPA и Bean Проверка

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ссылки

Ответ 3

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

Ответ 4

Вы можете сделать валидатор прочитанным аннотации JPA и применить его. Вот несколько примеров использования валидаторов spring, которые можно использовать в качестве идеи для расширения.

JPA JSR303 spring Проверка формы

Вы также можете ввести (@Inject или spring @Autowired) ваш сеанс bean в пользовательский валидатор, и контейнер должен знать, как его подключить. Я знаю только это как пример spring:

import javax.validation.ConstraintValidator;

public class MyConstraintValidator implements ConstraintValidator {

@Autowired //@Inject
private Foo aDependency;

...
}