2011-10-25 7 views
2

私はクラスレベルで@Where属性を持つHibernateエンティティに注釈を付けました。 これは、直接問合せするときにロードされるエンティティを制限しますが、そのクラスのコレクションには適用されないようです。それは期待されますか?Hibernate - クラスレベル@そのアノテーションはそのクラスのコレクションに適用されていませんか?

ドキュメントはこの上に明確ではない:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-class

(オプション):このクラスのオブジェクトを取得する際の条件が を使用する任意のSQLを指定します。

私には、そのクラスのオブジェクトが取得されるすべてのケースに当てはまるように聞こえますが、これはコレクションでは無視されています。

  1. これはコレクションのためのものですか?
  2. もしそうでなければ、クラスのすべてのインスタンスとそのクラスのすべてのコレクションにフィルタをグローバルに適用する最も良い方法は何ですか?

(UPDATE:私はドキュメントの問題を追跡するためにhttps://hibernate.atlassian.net/browse/HHH-6781を上げ) "のgetAll" または "LOADALL" を使用した場合

+0

それはうまくいくようですコレクションのために、しかし、そうでなければ、ドキュメントはそれを明確にすべきです。私は発生しましたhttps://hibernate.onjira.com/browse/HHH-6781 – Rich

+0

私は同じ問題が発生しているが、クラスを直接クライテリアAPIを介して 'createCriteria(MyEntity.class).scroll()'として照会するとき。あなたのケースでは、どのような方法でHQLまたはCriteria APIを使用していましたか? – Vlad

+0

私は基準を使用していました:list()ではなくscroll()ですが、違いがあるとは思いません。 – Rich

答えて

1

@Whereクラスレベルでは、不要なインスタンスを省略します。 @クラスレベルでは、そのエンティティのコレクションに適用するために「カスケード」しません。コレクションプロパティレベルで

@Where パブリッククラスPuppySeller {

@Where(clause = "status='FOR_SALE'") 
    public Set<Puppy> getPuppiesForSale() {} 

あなたがDBから「PuppySeller」を選択すると、「puppiesForSale」のみ「FOR_SALE」と子犬によって移入されることを保証します状態。

ただし、第1レベルのコレクションにのみ適用されるため、非常に注意してください。私がこれを意味するのは、子犬がいて、同じ売り手が販売するすべての子犬を手に入れたいと言うことです。あなたは "myPuppy.getPuppySeller()。getPuppiesForSale()"のようなことをするかもしれません。しかし、あなたがこれを行うと、 "売り切れ"または "新生児"などのすべての子犬を含む、状態に関係なく、puppySellerに属しているすべての子犬で終わるでしょう。

+0

ありがとうございます。これは主にドキュメントのバグだと思う。その行動を私が予想していたものに変えることは時には有用かもしれませんが、BCが壊れるかもしれないと私は考えます。私はこのチケットを提出して文書の修正を追跡しています:https://hibernate.atlassian.net/browse/HHH-6781 – Rich

関連する問題