2009-12-02 20 views
10

私はクラスUserを持っています。ユーザーは他の多くのユーザーと友人になることができます。その関係は相互に関係している。 AがBの友人であれば、BはAの友人です。また、2人のユーザーが友人になった日付など、すべての関係に追加のデータを保存したいと思います。したがって、これは、追加の列を持つ同じ表の多対多の関係です。私は中産階級の友人が作成されるべきであることを知っています(2つのユーザーIDと日付の列を含みます)。しかし、私はこれをHibernateにマッピングするのに不足しています。私を止めるのは、マッピングが同じテーブルにあるということです。多対多の関係が2つの異なる表の間にあったなら、私はそれを解決できます。追加の列を持つ同じテーブルの多対多

答えて

7

あなたはそれは良いアイデアではありません同じテーブル上

多対多の関係

を述べています。維持するのは悪夢です。

は、私は同じ問題を抱えていた代わりに

@Entity 
public class Friend { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer friendId; 

    @Column 
    private String name; 

    @OneToMany(mappedBy="me") 
    private List<MyFriends> myFriends; 

} 

@Entity 
public class MyFriends { 

    @EmbeddedId 
    private MyFriendsId id; 

    @Column 
    private String additionalColumn; 

    @ManyToOne 
    @JoinColumn(name="ME_ID", insertable=false, updateable=false) 
    private Friend me; 

    @ManyToOne 
    @JoinColumn(name="MY_FRIEND_ID", insertable=false, updateable=false) 
    private Friend myFriend; 

    @Embeddable 
    public static class MyFriendsId implements Serializable { 

     @Column(name="ME_ID", nullable=false, updateable=false) 
     private Integer meId; 

     @Column(name="MY_FRIEND_ID", nullable=false, updateable=false) 
     private Integer myFriendId; 

     public boolean equals(Object o) { 
      if(o == null) 
       return false; 

      if(!(o instanceof MyFriendsId)) 
       return false; 

      MyFriendsId other = (MyFriendsId) o; 
      if(!(other.getMeId().equals(getMeId())) 
       return false; 

      if(!(other.getMyFriendId().equals(getMyFriendId())) 
       return false; 

      return true; 
     } 

     public int hashcode() { 
      // hashcode impl 
     } 

    } 


} 

に関して、

+0

ありがとうございます。しかし、私は質問があります。 @ManyToOne関係に "insertable = false"を挿入するのはなぜですか?私はそれを削除する場合、それは動作します。そうしないと、MyFriendsが正しく永続化されません。私はHibernateの専門家ではないので、おそらく私は何かを理解していません。 –

+0

それでは、私はあなたのようなEmbedded Idを使用していませんが、別のIDカラムを使用しました。 EmbeddedIdはそれを処理するため、insertable = falseを入れました。あなたの答えは受け入れられる:) –

+0

あなたはなぜ気づいた。 2つのプロパティが同じ列を共有する場合、そのプロパティを1つのプロパティに配置することをお勧めします。さもなければ、Hibernateはいくつかのエラーを出すでしょう。 –

2

これはあなたのケースに合っているかどうかはわかりませんが、試してみてください。

@Entity 
public class Friend { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int friendId; 

    @Column 
    private String name; 

    @ManyToMany(mappedBy="owner") 
    private List<Friendship> friendships; 
} 

@Entity 
public class Friendship { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int friendshipId; 

    @OneToOne 
    private Friend owner; 

    @OneToOne 
    private Friend target; 

    // other info 
} 
1

を、このいずれかを試してみてください。次のようなことを試すことができます:

<class name="Friend" entity-name="RelatedFriend" table="FRIENDS"> 
    <id name="id" type="long"> 
     <generator class="native" /> 
    </id> 

    <!-- *** --> 

    <set name="relatedFriends" table="RELATED_FRIENDS"> 
     <key column="FRIEND_ID" /> 
     <many-to-many column="RELATED_FRIEND_ID" class="Friend" entity-name="RelatedFriend"/> 
    </set> 
</class> 
関連する問題