[英]JPA One To Many/Many To Many Example
我正在使用:
我必須創建一個允許用戶建立友誼的應用程序。
我仍處於設計階段,我想要這些表:
- User {_id, name, address}
- Friendship {idUserA, idUserB, date}
為了我的目的,我應該與用戶建立相互關系。 例如1是2的朋友,間接2是1的朋友。因此在我的表中,我認為有:
友誼= {1,2,...}
我在問我如何模擬這種行為。 我已經讀過他的主題: 在同一個表上具有多列的多對多關系,並且我遵循了該指令從實體(休眠屬性)生成數據庫表。 但是在此示例中,當我加載我的朋友A時,我有一個與朋友B的列表,而當我加載BI時,用戶A並未進入列表。
我該如何實現這種該死的相互關系?
據我了解,該示例並不相互暗示。 要從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;
}
實際上,我不是OneToMany尤其是ManyToMany關系的忠實擁護者。 我更喜歡像您一樣擁有另一張桌子,例如Friendship。 據我了解,您正在混合使用方法。 對我而言,最簡單的方法是擁有一個友誼表,而您在此表中所需要的就是匹配兩個朋友,因此設計可以是:
@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;
此實現的另一個優點是,您可以區分誰稍后要求成為朋友(如果需要)。
在我看來,是的,它似乎很復雜且工作過度,但它相當容易維護且不那么痛苦。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.