2010-05-14 1 views
2

Мне нужно выполнить проверку на основе результата SQL-запроса.Настройка проверки Hibernate для bean-компонента

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

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

выглядит следующим образом:

<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> 

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

обновление:

объект класса

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

ответ

3

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

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

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

+0

Благодарим за ответ, Паскаль. Да, проверка должна выполняться по результату SQL. Поток следующий: в случае, если результат запроса не пуст, транзакция для этого объекта должна быть выполнена. – sergionni

+0

@sergionni Добро пожаловать. Но я боюсь, что проверка Bean не является правильным инструментом для вашего потока. AFAIK, проверка Bean для, ну, проверка боба, а не проверка результатов запроса. –

+0

Спасибо, Паскаль, я обновил сообщение (добавлена ​​часть класса объекта). Таким образом, возможным шагом является разработка еще одного класса, чего-то. как CurrencyValidator, в котором я должен реализовать getNamedQuery («isValutaKursExists»)? – sergionni

3

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