私は概念的な問題に直面しています:Hibernateによってロードされたエンティティのいくつかの属性へのアクセスをフィルタリングする方法は?
例: 私は 4 つの車輪 (2 つは赤、2 つは青; 双方向リンク) のコレクション (セットまたはバッグ) を備えた車を持っています。ユーザー A は赤と青の車輪を見る権利があり、ユーザー B は青の車輪しか見ることができません。Cars を取得すると、ホイールもフェッチされます (Hibernate.initialize を使用する場合もあれば、クエリで直接フェッチする場合もあります)。
車をリクエストするとき、ユーザーが見る権利を持っているものだけにホイールをフィルタリングする方法を見つけたいと思います。(DBロード後のフィルタリング結果は今のところOK)
フィルタリングメカニズムを邪魔にならないようにしたいと思います。
機能しないもの:
@Filter (または @Where) : 資格情報のチェックは少しトリッキーです。ユーザーが wheel を表示することを許可されているかどうかを確認するために、他にもいくつかの結合を行う必要があります。
Spring ACL : 私の資格情報管理はトリッキーすぎてこれを使用できません (さらに、内部属性をフィルタリングできるかどうかはわかりません)。
実装されたソリューション:
- カスタム UserCollectionType を定義し、承認されたデータのみを取得する Collection Decorator を提供します (overload iterator(), get(int index),...) ; 欠点:私のコレクションは一貫性がありません: データが追加されると、現在のユーザーが許可されている場合にのみアクセスできます。それが信頼できる解決策であるかどうかはわかりません。
その他のソリューション:
ドメイン オブジェクトの AOP : これが最適だと思います。承認可能なエンティティのコレクションへのアクセサを定義するドメイン オブジェクトに AOP を追加し、アクセス時にそれらをフィルタリングします。不便: Hibernate によってロードされたドメイン オブジェクトに AOP を追加するのは難しいかもしれません。( cf. Hibernate マネージド POJO の Spring AOP アドバイス)
Hibernate Interceptor/Event : これを使用しようとしましたが、邪魔にならずに、自分がやりたいことを行うのに適した場所が見つかりませんでした。そして、ロードされたコレクションを「実際に」変更したくありません。休止状態に対して透過的でなければなりません(ユーザーBが非読み取り専用トランザクションでそれらにアクセスするたびに、Hibernateが車から赤い車輪を削除したくありません)。
公開されたサービスの AOP + イントロスペクション: トランザクション コンテキストの外側で、すべてのエンティティのすべてのコレクション属性を再帰的にフィルタリングして、未承認の要素を削除します。おそらく、より簡単で邪魔にならない解決策です。欠点: コレクションの属性は変更不可能な状態を維持できません。
実装されたソリューションについてどう思いますか? これを行う方法について他のアイデアはありますか?
(コンテキストは: Hibernate 4.1.3、Spring 3.1.1、Java 7)
ありがとう !