JSR-303 и JPA перекрываются - PullRequest
       16

JSR-303 и JPA перекрываются

3 голосов
/ 29 сентября 2011

Алоха, эй!

Я уже использую аннотации JPA, теперь я хотел бы также использовать аннотации JSR-303 для проверки атрибутов.

Мои вопросы: насколько хорошо они взаимодействуют друг с другом?
Если я использую @Basic(optional=false) или @NotNull, мне все равно придется использовать nullable=false и т. Д .?

Я не решил, какую реализацию валидатора использовать, например. hibernate-validator или oVal (Вы также можете предложить другие. Я знаю, что oVal не является реализацией JSR-303, но он отображает большинство аннотаций ).

В овальном руководстве (см. Выше) говорится, что некоторые аннотации JPA будут также преобразованы в овальные аннотации. Hibernate-валидатор имеет аналогичный механизм .

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

Ответы [ 2 ]

6 голосов
/ 29 сентября 2011

Они оба проверяют время выполнения. Хотя есть некоторая разница
Состояния спецификации JPA @Basic(optional = false) можно использовать в качестве подсказки схемы, т. Е. Если вы обновляете схему своей базы данных с помощью JPA (как правило, это не очень хорошая практика), вы можете использовать ее, чтобы указать, что значение этого столбца не может быть нулевым и должно иметь значение.

Раздел 9.1.18 Основная аннотация спецификации JPA1
и
Раздел 11.1.6 Основная аннотация спецификации JPA2

Четко указать, что.

Кроме того, оба будут выполнять проверку во время выполнения другими словами перед отправкой sql в базу данных.
Как правило, для проверки перед отправкой SQL на сервер, если вы используете JSR 303, который также включает в себя множество других проверок, вы будете использовать @NotNull, однако вы можете не использовать JSR 303, и в этом случае вы можете использовать @Basic(optional = false), который даже вышел до JSR 303, однако, не является предпочтительным по сравнению с JSR303.
Возможно, вы захотите узнать, что @Column(nullable = false) используется исключительно на стороне базы данных.
Если вы когда-либо используете оба - да, только если вы разрешаете JPA обновлять схему, в противном случае JSR-303 предпочтительнее другого.

0 голосов
/ 30 сентября 2011

После почти полного прочтения обеих спецификаций я нашел это.

Таким образом, я сам отвечу на свой вопрос;
На данный момент;

  • Аннотации JPA и BV часто имеют одно и то же значение.Однако использование ограничений BV не влияет на созданные ограничения схемы DDL реализации JPA.

  • Реализация JPA, если она настроена таким образом, будет проверять ограничения BV на уровне pre-persist, pre-обновить и предварительно удалить.Это делается путем делегирования работы реализации BV.Реализация BV, с другой стороны, не будет использовать ограничения JPA.

  • Использование ограничений BV, таких как @NotNull, для автоматического вызова ограничений JPA, таких как @Column(nullable=false), рекомендуется для реализации JPA вспецификация BV, но не является частью официальной спецификации и, следовательно, ненадежного поведения.

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

Ссылки

PS: я подожду, есть ли у кого-нибудь какие-либо исправления или дополнения к этому, затем задайте в качестве предпочтительного ответа.

...