На самом деле я не большой поклонник отношений 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;
Еще одним преимуществом этой реализации является то, что вы можете различать, кто запросил дружбу позже (если это необходимо).
На мой взгляд, да, это кажется сложным и переутомленным, но это довольно ремонтопригодно и менее болезненно.