2012-05-07 137 views
3

我有這樣的實體Friendship多個一對多關係連接列

@ManyToOne 
private User user1; 
@ManyToOne 
private User user2; 
... and other properties of the friendship 

每友誼存在這個實體(而不是2)只有一個實例/記錄,所以不能有任何問題,約翰在哪兒Jane的一位朋友,但不是相反。這些條目也被標準化,所以具有最低ID的友誼的成員是user1,另一成員是user2,這意味着我可以用簡單的唯一約束來防止重複的條目。

爲了得到我執行一個查詢某個用戶的友誼與

WHERE user1 = :me OR user2 = :me

是否有可能將該地圖映射到的@OneToMany Set<Friendship>屬性上?

Friendship具有其他屬性,所以這並不是簡單@ManyToMany Set<User> friends

回答

0

是的,它是可能的。但爲什麼你需要@OneToMany?你可以使用@ManyToMany。它會一樣。在@ManyToMany註釋中,您可以指定將存儲ids user1 - user2對的表。然後只需查詢此表。

+0

這隻會檢索單向連接(1-> 2)的連接。我相信這個問題是雙向的。 –

1

簡短的回答是否定的。對於雙向提取,我相信唯一可以做的就是使用命名查詢。沿着線的東西:我已經在過去做到了這一點

@Entity 
@NamedQuery(name="User.friendships", query=" 
    select u 
    from User u 
    where u in (
     select f.User1 
     from Friendship f 
     where f.User2.id = :userId 
    ) or u in (
     select f.User2 
     from Friendship f 
     where f.user1.id = :userId 
)") 
public class User { 

private Set<User> friends = new HashSet<User>() 

public Collection<User> getFriendships(Session s) { 
    return s.getNamedQuery("User.friendships") 
     .setParameter("userId", this.id) 
     .list(); 
} 

}

的方法就是以某種方式去規範的連接表,無論是通過重複列(映射在每一個關聯方向)或重複行。要麼可以讓你簡化你的抓取。