3

JPAのテストアプリは、ユーザーが私の町で訪れたパブの数を追跡します。私はこれをユーザーオブジェクトに持っています

@ManyToMany(mappedBy = "users")
private List<Pub> visited;

そして、パブオブジェクトの反対側

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
    joinColumns =
@JoinColumn(name = "pubid"),
inverseJoinColumns =
@JoinColumn(name = "userid"))
protected Set<User> users;

ただし、パブが閉じられたことを示す列でパブテーブルを更新しました。ユーザーの訪問済みリストにアクティブなパブのみを含めたいので、質問は

テストに合格したパブ(table.closed = falseなど)のみがユーザーの訪問済みリストに含まれるように、これらのオブジェクトを条件付きで結合するにはどうすればよいですか?

その下でHibernateとPostgresを使用しています。

4

3 に答える 3

6

当分の間、Hibernate 固有の @Where アノテーションを使用してこれを解決しました。次のように、ユーザーの pub コレクションに追加の注釈が必要でした。

@ManyToMany(mappedBy = "users")
@Where(clause="closed='false'")
private List<Pub> visited;

もちろん、私は今 Hibernate に縛られていますが、これはこのプロジェクトにとって大きな問題ではありませんが、一般的な JPA ソリューションを持っている人がいれば、ぜひ聞いてみたいです。

于 2012-10-25T09:09:11.100 に答える
1

あなたが望むものを達成する、またはむしろシミュレートする方法はいくつかありますが、残念ながら本当にきれいなものはありません。

@PostLoadUser エンティティ自体、または専用のリスナーでメソッドを使用できます(エンティティにアノテーションを付けて@EntityListeners(YourFilter.class)、リスナーを構成します)。この方法では、必要に応じてエンティティをフィルタリングできます。

このアプローチの主な問題は、永続化/マージすると、フィルターによって行われた変更も永続化されることです。

これは回避できます。元の永続的なパブに加えて、フィルタリングされたパブを保持する別の一時的なリストを持つことができます。または、PostLoad フィルタリングをそのままにして、getter で単純にフィルタリングすることもできます。これは汚いように聞こえるかもしれませんが、リスナーのアプローチは変装して汚いです。

于 2012-10-24T15:42:59.927 に答える