私はクラスUserを持っています。ユーザーは他の多くのユーザーと友人になることができます。その関係は相互に関係している。 AがBの友人であれば、BはAの友人です。また、2人のユーザーが友人になった日付など、すべての関係に追加のデータを保存したいと思います。したがって、これは、追加の列を持つ同じ表の多対多の関係です。私は中産階級の友人が作成されるべきであることを知っています(2つのユーザーIDと日付の列を含みます)。しかし、私はこれをHibernateにマッピングするのに不足しています。私を止めるのは、マッピングが同じテーブルにあるということです。多対多の関係が2つの異なる表の間にあったなら、私はそれを解決できます。追加の列を持つ同じテーブルの多対多
10
A
答えて
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
}
}
}
に関して、
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>
関連する問題
- 1. 同じ多対多テーブルからのクエリ
- 2. コアデータ多対多のカスタムフィールドを持つテーブル
- 3. 多対多の同じPK
- 4. Doctrine 1の多対多結合テーブルに列を追加する
- 5. EasyAdminBundleでJoinテーブルを持つ多対多
- 6. MVC3エンティティフレームワーク多対多の追加列
- 7. Entity Framework 4.1:コレクション内に同じオブジェクトを持つ多対多
- 8. Fluent Nhibernateテーブルが複数の列を持つ多対多
- 9. 同じテーブル間の多対多のカスケード削除
- 10. このクエリに多対多のテーブルのリレーションシップを追加する
- 11. Grailsは同じテーブルの多対多関係
- 12. ラーベル - 親と同じテーブルの1対多多く
- 13. Symfony Propel多対多追加
- 14. 同じモデルのLaravel多対多関係
- 15. 参加/リンク/多対多のテーブルのガイドライン
- 16. JPAは、多対多の複合キーを持つテーブルのエンティティに参加
- 17. アソシエーションタイプのフィールドを持つActiveRecordの多対多テーブル - Rails
- 18. 多対多の関係を持つコアデータ内のNSSetにオブジェクトを追加する
- 19. 多対多に1対多の接続を追加する
- 20. 多対多マッピング+関連テーブルの追加フィールド
- 21. Hibernate:多対多の結合テーブルを持つ基準?
- 22. 多対多の関係djangoに追加
- 23. 多対多の関係を持つモデル
- 24. 多対多の関係を持つNSSortDescriptor
- 25. Doctrine:多対多のフィールドを持つUniqueEntity
- 26. 追加の関係を持つ多対多リレーションシップをどのように構成するか:傍受テーブルのhasMany
- 27. 1対多と多対多のフィールドを持つFactory Boyモデル
- 28. 多対多結合テーブルに余分な属性を追加
- 29. 多対多関係テーブルを持つエンティティHibernateマッピング
- 30. この多対多のテーブル
ありがとうございます。しかし、私は質問があります。 @ManyToOne関係に "insertable = false"を挿入するのはなぜですか?私はそれを削除する場合、それは動作します。そうしないと、MyFriendsが正しく永続化されません。私はHibernateの専門家ではないので、おそらく私は何かを理解していません。 –
それでは、私はあなたのようなEmbedded Idを使用していませんが、別のIDカラムを使用しました。 EmbeddedIdはそれを処理するため、insertable = falseを入れました。あなたの答えは受け入れられる:) –
あなたはなぜ気づいた。 2つのプロパティが同じ列を共有する場合、そのプロパティを1つのプロパティに配置することをお勧めします。さもなければ、Hibernateはいくつかのエラーを出すでしょう。 –