2012-03-29 66 views
1

我使用:JPA一對多/多對多的例子

  • 休眠
  • MySQL的
  • JBOSS

我要創建一個應用程序,允許用戶進行友誼。

我仍然在設計階段,我想有這些表:

- User {_id, name, address} 
- Friendship {idUserA, idUserB, date} 

對於我的目的,我應該從用戶的相互關係。例如1是2的朋友和間接2是1 朋友所以在我的表,我認爲有:

友誼= {1,2,...}

我問我怎麼樣可以模擬這種行爲。我讀過他的主題:Many-to-many on the same table with additional columns,我遵循這個指令從實體(休眠屬性)生成數據庫表。但在這個例子中,當我加載我的朋友A時,我有一個朋友B的列表,當我加載B時,我沒有將用戶A加入列表。

我該如何實現這種該死的相互關係?

+0

你可以給一些示例代碼如何設計你的實體類嗎? – magomi 2012-03-29 13:14:20

+0

我直接複製:http://stackoverflow.com/questions/1831186/many-to-many-on-the-same-table-with-additional-columns from Arthur Ronald FD Garcia – CeccoCQ 2012-03-29 13:16:08

回答

1

就我所瞭解的這個例子而言,相互性並不是隱含的。已經從A-> B和B-來自>你必須要麼添加兩個條目到表中友誼的關係,或者您必須實現兩套並返回兩個列表的交集:

@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; 
} 
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; 

這個實現,你可以區分誰要求成爲後來朋友(如果需要的話)的另一個優點。

在我看來,是的,它似乎是複雜和過度勞累,但它是相當可維護和較少痛苦。

+1

一個人可以有多重友誼 - 這是一對多的關係。如何通過中間表進行更改?這仍然是一個很多...我也很好奇你將如何存儲(說)地址 - 多個人可以住在同一個地址,一個人可以有多個地址 - 不使用多對多關係?除非我誤解了你的開頭段落? – Basic 2012-03-29 15:04:48

+0

是的,當然..例如,如果一個用戶有另一個朋友,那麼它意味着友誼表中的新記錄。所以每一個友誼都有一個友誼表中的記錄。您可以在不使用多對多關係的情況下實施多地址多人。實際上在大多數應用程序中只需要一個地址作爲當前地址。所以你有用戶表中的用戶和地址表多對一的關係來尋址,所以你有多個用戶在同一個地址。但是,如果你需要多個地址中的多個用戶,你需要一個useraddress表,它具有user_id,address_id,所以你現在可以擁有你所需要的。 – huzeyfe 2012-03-29 15:25:14

+0

一致認爲,地址不是一個很好的例子,通常它是一對多的,但是你用一個包含'user_id'和'address_id'的表描述的是一個多種多樣的關係,據我所知(和[維基百科(http://en.wikipedia.org/wiki/Many-to-many_%28data_model%29))。 – Basic 2012-03-29 16:21:16