2

SQLクエリの結果に基づいて検証を実行する必要があります。

クエリはアノテーションとして定義されています-エンティティBeanでは@NamedQueryとして定義されています。

Hibernateのドキュメント(doc)によると、次の操作でBeanを検証する可能性があります。pre
-
updatepre-insert
pre-delete

次のようになります:

<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 {
...
4

2 に答える 2

3

問題は、上記の検証構成にBeanを接続する方法です。

、(組み込み)などの制約追加したり、独自の制約を定義したりするには、BeanValidationAPIからのアノテーションでBeanにアノテーションを付ける必要があります。ただし、Bean Validationは、SQLクエリの結果に基づいて検証を実行することを意図したものではありません。@NotNull@Size

ちなみに、@NamedQueryあなたはHibernateEntityManagerを使用しているとおっしゃっていました。その場合、Bean Validationを(Hibernateではなく)JPAと統合することをお勧めします。JPA 2.0を使用している場合は、BeanValidation実装をクラスパスに配置するだけです。JPA 1.0を使用している場合は、この前の回答を参照してください。

于 2010-05-14T16:19:46.583 に答える
3

はい、正しいアプローチは、ValidCurrencyやそれに対応するValidCurrencyValidatorなどのカスタム制約です。HibernateセッションまたはHibernateセッションにアクセスする必要があります。ConstraintValidator実装のEntityManager。Hibernatewikiでこれを行う方法に関するいくつかのアイデアを得ることができます-ConstraintValidator内のHibernateセッションへのアクセス

于 2010-05-20T09:23:39.330 に答える