質問

これは、私はこの問題を把握し、多くの人が同様の問題を持って周りグーグルからしようとしているかなりの時間です。

私は、Hibernateを使用して、ソーシャルネットワーク内のユーザをモデル化しようとしている、と何が友好関係をマッピングするよりも、ソーシャルネットワークへのより基本的なのですか? システム内のすべてのユーザーは、それの友人のリストを持っていなければならないと私は、これは信じられないほど簡単な作業(単に多対多の関係を使用し、右?)かもしれないと思いました。だから私は、次のことをしようとするようになった。

@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   protected List<User> friends = null
}

問題は、今では私が友人と親交の間に明確な区別を持たないことにより、誤って多対多を使用する私に語ったということです。これまでのところは良い、私はエラーを取得するが、私は私が欲しいものをどのように行うことができますか?

任意のアイデア?私は私の知恵の最後に到達しました。

役に立ちましたか?

解決

多くの多くについての事実は、その不可欠Hibernateが関係テーブルを生成するので、それは、もう少し設定を必要としていることです。 これを試してください:


@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   @JoinTable(name = "user_friends", 
       joinColumns = @JoinColumn(name = "user_id"), 
       inverseJoinColumns = @JoinColumn(name = "friend_id"))
   protected List friends = null;
   @ManyToMany(mappedBy = "friends")
   protected List befriended = null;
}

)=それが動作ホープ

編集:また、種類をフェッチと非常に注意してください...あなたはアウト・オブ・コントロールループをフェッチするユーザーを入力して、すべてのDBを得ることができます。

他のヒント

ManyToManyアノテーションはmappedByパラメータを持っています。私は

のようなものを推測します
@ManyToMany(mappedBy = "friends")

働くかもしれません。いずれの場合も、のドキュメントを参照してくださいのます。

編集ます:

多くの関係に多くの両端からアクセスできるようにする必要があるかのように

それはそうです。現在、あなたは、一方の端部からのみアクセス可能です。たぶん、あなたは同様に他の関係を追加する必要があります:

@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   protected List<User> friends = null;
   @ManyToMany(mappedBy = "friends")
   protected List<User> befriended = null;
}
それでも解決しない場合は、

あなたは常に2人のユーザー間の関係を表す別のクラスを導入し、すべてのユーザーが、このクラスのインスタンスのコレクションを持って聞かせすることができます。

良い点は、実際に私はそれを試してみました。問題は、私はその後、mappedBy属性をtrueが、無効である関係、の両側に設定されて苦情を得ることです。 私は解決策になるかもしれない友人を取得するためにいくつかの巧妙なカスタムクエリを持つ単純な@ManyToMany天気を思っていました。 ManyToManyuser_idfriend_id,でテーブルを結合生成するだろうが、クエリは、すべてのユーザーに一致がfriend_idかであるuser_idのいずれかを返す、フィールドのいずれかと一致します。 任意のアイデア?

もちろん、それは良いの修正だろう、まだ私はまだ完全に販売していませんよ。基本的に友人を得るために、私はかなり不十分である、2つのコレクションをマージする必要があると思います。

休止状態で冪等、反射関係を作成するための全くない方法はありますか?

私は今日も同じ問題を抱えています。

@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   protected List<User> friends = null
}

[OK]をする必要があり、私は同様の構造を使用していました。しかし、私は遅延読み込みの例外を持って、EAGERにfetchTypeを設定するとき、私は袋の再帰的な初期化についての苦情を得ています。

クエリでは、あなたが、「ユーザー」をフェッチするような何かをするために使用します:

どのように私は私の問題を修正

from User as u left join fetch u.friends

これは、そのエンティティの友人のリストを初期化します。それは友人たちからの任意の友達を初期化しないのに注意してください。それは実際には良いことです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top