3

再帰構造を許可するために、それ自体 (parent_id) への FK を持つデータベース テーブル "viewmodule" があります。

CREATE TABLE viewmodule (
id,
type,
parent_id,
hide);

私の Java アプリケーションは JPA/Hibernate を使用して、そのテーブルのエンティティをマップします。テーブルの「タイプ」列を使用する @Discriminator アノテーションによって解決されるエンティティ階層を修正しました。

public class ViewModule implements Serializable {
   private long id;
   private String type;
   private ViewModule parent;
   private Boolean hide;

   @OneToMany( targetEntity = ViewModule.class, cascade = javax.persistence.CascadeType.ALL, mappedBy = "parent" )
   @Cascade( { org.hibernate.annotations.CascadeType.ALL,
            org.hibernate.annotations.CascadeType.DELETE_ORPHAN } )
   private Set<ViewModules> children;
(...)
}

私のタスクは、このテーブルからすべての要素を (詳細に) ロードすることですが、フィールド「非表示」が true に設定されているものは除外します。明らかに単純なフィルターメカニズムです。私の最初のアプローチは、Hibernate Filter アノテーションを使用することでした。これは、最初のレイヤー (parent_id = null のすべてのビューモジュール) でうまく機能します。ただし、フィルターは「子」関係では機能しません。(私の実際のモデルでは、ViewModule のさまざまなタイプの継承構造があります)

したがって、viewModule オブジェクト ツリーを再帰的にウォークスルーし、hide=true; を持つ子関係から viewModules を削除する小さな関数を作成しました。

ただし、すべてのオブジェクトはまだ jpa/hibernate entityManager の監視下にあるため、コレクションからのすべての削除は、データベースで削除として直接実行されます。したがって、フィルター関数はデータベースからエンティティを削除しますが、これは悪いことです。

休止状態セッションから「エビクト」メソッドを使用して、フィルタリングする前にエンティティをデタッチしようとしましたが、それは LazyInitialisationException につながります。

だから、私のオブジェクトのすべての複製を防ぐために、私の質問はこの問題を解決する方法ですか? すべてのコレクションが初期化されるようにオブジェクトをデタッチする方法はありますか? または、コレクションをフィルタリングできる特別な Kung-Fu Chuck-Norris JPA アノテーションはありますか?

前もって感謝します

4

2 に答える 2

1

ネイティブ クエリを使用する

em.createNativeQuery("select * from viewmodule where hide = false", ViewModule.class).getResultList();

これは機能します: jpa/hibernate クエリによって返されるエンティティに含まれるフィルター リスト

于 2011-07-27T09:02:36.523 に答える
0

新しいコレクションを作成し、 を持つ要素のみを追加しますhide=false。そのコレクションをオブジェクトと一緒に配布することはできないため、別のメソッド呼び出しから返す必要があります。例えば:dao.getVisibleItems(module)

もう 1 つのこと - Cascade.DELETE (つまり、delete 以外のすべてのカスケードをリストする) と孤立した削除が必要ない場合は削除できます。

于 2011-07-27T08:53:15.833 に答える