3

私がこの問題を理解しようとしているのはかなりの時間であり、多くの人が同様の問題を抱えていることをグーグルで調べています。

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

@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 を間違って使用していることを教えてくれることです。これまでのところ、エラーが発生しましたが、どうすればやりたいことができますか?

何か案が?私は私の知恵の終わりに達しました。

4

5 に答える 5

1

多対多の事実は、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;
}

それがうまくいくことを願っています=)

EDIT:また、フェッチタイプには十分注意してください...ユーザーが制御不能なループをフェッチして、すべてのDBを取得できます。

于 2008-12-29T15:24:37.407 に答える
1

注釈には、ManyToManymappedBy パラメーターがあります。のようなものだと思います

@ManyToMany(mappedBy = "friends")

動作する可能性があります。いずれにせよ、docsを参照してください。

編集:

多対多の関係は、両端からアクセスできる必要があるようです。現在、あなたのものは一方の端からしかアクセスできません。たぶん、他のリレーションも追加する必要があります。

@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 人のユーザー間の関係を表す別のクラスを導入し、すべてのユーザーにこのクラスのインスタンスのコレクションを持たせることができます。

于 2008-12-28T17:13:36.483 に答える
0

もちろんそれは良い修正になるでしょう、それでも私はまだ完全に売られていません。基本的に友達を作るには、2つのコレクションをマージする必要がありますが、これは非常に不十分です。

休止状態でべき等で反射的な関係を作成する方法は絶対にありませんか?

于 2008-12-28T17:51:59.760 に答える
0

今日も同じ問題がありました。

@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
}

大丈夫です、私は同様の構造を使用しました。ただし、遅延読み込みの例外が発生し、fetchType を EAGER に設定すると、バッグの再帰的な初期化について苦情がありました。

問題の修正方法:「ユーザー」を取得するために使用するクエリで、次のようにします。

from User as u left join fetch u.friends

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

于 2009-02-25T12:06:50.330 に答える
0

良い点、そして実際に私はそれを試しました。問題は、リレーションシップの両側でmappedBy属性が設定されているという苦情を受け取ることです。これは真実ですが、無効です。@ManyToMany友人を取得するためのいくつかの巧妙なカスタムクエリを使用した単純な方法が解決策になるのではないかと考えManyToManyuser_idいましたfriend_id,. . 何か案は?friend_iduser_id

于 2008-12-28T17:20:23.023 に答える