3

私はこのエンティティを持っていますFriendship:

@ManyToOne
private User user1;
@ManyToOne
private User user2;
... and other properties of the friendship

友情ごとに、このエンティティのインスタンス/レコードは 1 つのみ (2 つではありません) であるため、John が Jane の友人であるが、その逆ではないという問題は発生しません。エントリも正規化されているため、ID が最も低いフレンドシップuser1のメンバーは であり、他のメンバーは ですuser2。つまり、単純な一意の制約でエントリの重複を防ぐことができます。

特定のユーザーの友情を取得するには、クエリを実行します

WHERE user1 = :me OR user2 = :me.

@OneToMany Set<Friendship>それを のプロパティにマッピングすることは可能Userですか?

(Friendship他の性質を持っているので、これは単純ではありません@ManyToMany Set<User> friends)

4

2 に答える 2

1

簡単な答えはノーです。双方向フェッチの場合、要求していることを実行する唯一の方法は、名前付きクエリを使用することだと思います。次のようなもの:

@Entity
@NamedQuery(name="User.friendships", query="
    select u 
    from User u
    where u in (
        select f.User1
        from Friendship f
        where f.User2.id = :userId
    ) or u in (
        select f.User2
        from Friendship f
        where f.user1.id = :userId
)")
public class User {

private Set<User> friends = new HashSet<User>()

public Collection<User> getFriendships(Session s) {
    return s.getNamedQuery("User.friendships")
        .setParameter("userId", this.id)
        .list();
}

}

私が過去にこれを行った方法は、重複する列(各方向に関連付けをマッピングする)または重複する行のいずれかを介して、何らかの方法で結合テーブルを非正規化することです。どちらでも、フェッチを簡素化できます。

于 2012-05-07T14:33:15.603 に答える
0

はい、可能です。しかし、なぜ@OneToManyが必要なのですか?@ManyToManyを使用できます。同じになります。@ManyToManyアノテーションでは、IDのペアuser1-user2が格納されるテーブルを指定できます。次に、このテーブルに対してクエリを実行します。

于 2012-05-07T14:11:31.293 に答える