Уникальное ограничение с помощью JPA и Bean Validation - PullRequest
37 голосов
/ 16 августа 2010

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

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

Ответы [ 4 ]

50 голосов
/ 17 августа 2010

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

В спецификации BV она сводится к следующему:

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

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

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

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

Ссылки

5 голосов
/ 13 ноября 2010

Более подробную информацию о том, как реализовать @Unique и о проблемах вокруг него, можно найти здесь - http://community.jboss.org/wiki/AccessingtheHibernateSessionwithinaConstraintValidator

3 голосов
/ 16 августа 2010

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

2 голосов
/ 06 октября 2010

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

JPA JSR303 Проверка формы пружины

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

import javax.validation.ConstraintValidator;

public class MyConstraintValidator implements ConstraintValidator {

@Autowired //@Inject
private Foo aDependency;

...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...