我正在使用:
我必须创建一个允许用户建立友谊的应用程序。
我还处于设计阶段,我想拥有这些表格:
- User {_id, name, address}
- Friendship {idUserA, idUserB, date}
为了我的目的,我应该与用户建立相互关系。例如1是2的朋友,间接2是1的朋友。 所以在我的表中我认为:
友谊= {1,2,...}
我在问我如何模拟这种行为。我已经阅读了他的主题:Many-to-many on the same table with additional columns并且我遵循了这条指令从实体(hibernate的属性)生成数据库表。但是在这个例子中,当我加载我的朋友A时,我有一个朋友B的列表,当我加载B时,我没有用户A进入列表。
我如何实现这种该死的相互关系?
答案 0 :(得分:1)
据我所知,这个样本的相互关系并不是隐含的。要从A-> B和B-> A获得友谊关系,您必须在表中添加两个条目,或者必须实现两个集合并返回两个列表的交集:
@OneToMany(mappedBy="myFriends")
private List<MyFriends> myFriends;
@OneToMany(mappedBy="me")
private List<MyFriends> iAmFriendOf;
...
Set<MyFriends> getFriends() {
Set<MyFriends> friends = new HashSet<MyFriends>();
friends.addAll(myFriends);
friends.addAll(iAmFriendOf);
return friends;
}
答案 1 :(得分:0)
其实我不是OneToMany的忠实粉丝,特别是ManyToMany的关系。我更喜欢像你一样拥有像友谊这样的另一张桌子。所以据我所知,你正在混合方法。对我来说最简单的方法是拥有一个友谊表,在这张表中你需要的只是两个朋友的匹配,所以设计可能是:
@Entity
public class User{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column
private String name;
@Column
private String address;
}
@Entity
public class Friendship {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@ManyToOne
@JoinColumn(name="friend_requester_id")
private User friendRequester;
@ManyToOne
@JoinColumn(name="friend_accepter_id")
private User friendAccepter;
private Date date;
}
当列出朋友时,您可以列出友谊 - 因为他们是使用此表的另一个表或朋友。但是它有点棘手如果你想只列出朋友但不是那么难。您可以使用getFriends(List<Friendship> friendships, int userId)
方法并列出以下朋友:
List<User> friends ...
Iterator iterator = friendships.iterator();
while (iterator.hasNext()) {
Friendship friendship = (Friendship) iterator.next();
if (friendship.getFriendRequester().getId != userId) {
friends.add(friendship.getFriendRequester);
} else {
friends.add(friendship.getFriendAccepter);
}
}
return friends;
此实施的另一个优点是,您可以区分之后请求成为朋友的人(如果需要)。
在我看来,是的,它看似复杂而且过度劳累,但它相当可维护,而且不那么痛苦。