2017-02-13 11 views
8

永続的なコレクションを、それに含まれるオブジェクトに基づいてフィルタリングまたは操作しようとしています(特定のエントリを除外します)。Hibernate - コレクションのポストロードを操作する

この操作は、さまざまなコレクションを含む多数の異なるオブジェクトに対して実行されるため、可能な限り一般的でなければなりません。 HQL \ SQLレベルでのフィルタリングは、メンテナンスが不可能なのでオプションではありません。つまり、コレクションがロードされて初期化された後に実行する必要があります。 私たちは現在、多くのHibernateイベントを単一のオブジェクト( )を処理するために使用していますので、InitializeCollectionEventでリスンしようとしました。 しかし、わかるように、ほとんどのコレクションはHQL Fetchを使用して初期化されるため、このイベントは発生しません。

私たちが使用できる他の休止イベントはありますか?

コレクションがロードされた後にコレクションが処理される他の場所はありますか?

私たちはHibernate 4.1.7を使用しています。

答えて

1

コレクションがロードされたときにサーバー側でコレクションをフィルタするのは良い考えではないと思います。あなたがそれをするならば、間違っていることを意味し、dbモデルまたはエンティティ構造を再考します。収集をフィルタリングするための最良の方法の1つは、HQLを使用することです。または、 @Whereまたは@Loader、@Filterのいずれかを使用できます。

+0

私はあなたに同意しますが、このケースではmodel \ databaseの変更はオプションではありません。これは大規模かつ複雑な生産システムであり、その影響は大きすぎると危険です。 私が上で述べたように、フィルタリングはHQLを介して可能であり、提案したようにHibernateアノテーションも可能ですが、後で維持することは非常に難しいでしょう。 理想的には、操作はイベントまたはLoaderクラスを使用してロードフェーズ内で実行する必要があります。 – Nir

+0

OK、@PostLoadを試しましたか?私は確信していませんが、試してみることができます。そして、私はorg.hibernate.Interceptorで試してみることをお勧めします。ちょうど独自の実装を作成してください。インターセプタは本当に強力なクラスです。 – idmitriev

+0

インターセプタはコレクションを処理できますが、初期化されません。 – Nir

関連する問題