簡體   English   中英

JPA一對多/多對多示例

[英]JPA One To Many/Many To Many Example

我正在使用:

  • 過冬
  • 的MySQL
  • 老板

我必須創建一個允許用戶建立友誼的應用程序。

我仍處於設計階段,我想要這些表:

- 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM