Настройка проверки Hibernate для bean-компонента - PullRequest
2 голосов
/ 14 мая 2010

Мне нужно выполнить проверку на основе результата SQL-запроса.

Запрос определяется как аннотация - как @ NamedQuery в моем компоненте управления данными.

Согласно документации Hibernate ( doc ), существует возможность проверки bean-компонента при следующих операциях:
предварительно обновление
предварительно вставить
предварительно удалить

выглядит так:

<hibernate-configuration>
    <session-factory>
       ...
    <event type="pre-update">
       <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
    </event>
    <event type="pre-insert">
        <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
    </event>
    <event type="pre-delete">
        <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
    </event>
</hibernate-configuration>

Вопрос в том, как связать мой bean-компонент с конфигурацией проверки, описанной выше.

Последнее обновление:

класс сущности

...
@Entity
@NamedQuery(name = "isValutaKursExists", query = "SELECT id FROM CurrencyRate WHERE bankId = :bankNum")
@Table(name = "Currency")
public class Currency {
...

Ответы [ 2 ]

3 голосов
/ 20 мая 2010

Да, правильным подходом будет пользовательское ограничение, например ValidCurrency и соответствующий ValidCurrencyValidator . Вам понадобится доступ к сеансу Hibernate, соответственно. EntityManager в вашей реализации ConstraintValidator. Вы можете получить некоторые идеи о том, как это сделать, в вики Hibernate - Доступ к сеансу Hibernate в ConstraintValidator

3 голосов
/ 14 мая 2010

Вопрос в том, как подключить мой bean-компонент к конфигурации проверки, описанной выше.

Вам необходимо аннотировать свой компонент с помощью аннотаций из API проверки компонентов, чтобы добавить ограничений , таких как @NotNull, @Size ( встроенный ) или определить свой собственный. Но Bean Validation на самом деле не предназначена для выполнения проверки на основе результата SQL-запроса .

Кстати, вы упомянули @NamedQuery, так что я думаю, что вы используете Hibernate EntityManager. В этом случае я бы рекомендовал интегрировать Bean Validation с JPA (вместо Hibernate). Если вы используете JPA 2.0, просто поместите реализацию Bean Validation в classpath. Если вы используете JPA 1.0, см. этот предыдущий ответ .

...