2008-12-28 150 views
3

我試圖弄清楚這個問題並且圍繞許多人搜索類似的問題搜索相當長的一段時間。休眠:映射社交網絡中的用戶 - 朋友關係

我試圖在社交網絡中使用Hibernate模擬用戶,還有什麼比映射友誼關係更基礎的社交網絡? 系統中的每個用戶都應該有它的朋友列表,我認爲這可能是一項非常簡單的任務(只需使用ManyToMany關係,對吧?)。所以,我繼續嘗試以下操作:

@Entity 
@Table(name="users") 
public class User { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="userid") 
    protected Long id = null; 
    @ManyToMany 
    protected List<User> friends = null 
} 

現在的問題是,它告訴我,我用多對多誤將其朋友之間沒有明顯的區別,並結識。到目前爲止這麼好,我得到了錯誤,但我怎麼能做我想要的?

任何想法?我已經達到了我的智慧。

回答

1

關於多對多的事實是,它需要多一點配置,因爲它迫使Hibernate生成關係表。 試試這個:


@Entity 
@Table(name="users") 
public class User { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="userid") 
    protected Long id = null; 
    @ManyToMany 
    @JoinTable(name = "user_friends", 
     joinColumns = @JoinColumn(name = "user_id"), 
     inverseJoinColumns = @JoinColumn(name = "friend_id")) 
    protected List friends = null; 
    @ManyToMany(mappedBy = "friends") 
    protected List befriended = null; 
} 
 

希望工程=)

編輯:另外,要非常小心取出類型...您可以輸入一個用戶獲取外的控制迴路,並讓所有的DB 。

+0

我可以只與朋友做一個名單,哪裏會成爲朋友,結識朋友?在課堂上要列出什麼? – dikkini 2014-07-02 21:35:04

1

ManyToMany註釋具有mappedBy參數。我猜想像

@ManyToMany(mappedBy = "friends") 

可能工作。無論如何,請參閱docs

編輯:

看來,如果一個多對多的關係需要從兩端進行訪問。目前你只能從一端訪問。也許你應該添加其他關係以及:

@Entity 
@Table(name="users") 
public class User { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="userid") 
    protected Long id = null; 
    @ManyToMany 
    protected List<User> friends = null; 
    @ManyToMany(mappedBy = "friends") 
    protected List<User> befriended = null; 
} 

如果不工作,你總是可以推出表示兩個用戶之間的關係,一個單獨的類,並讓每個用戶有這樣的類的實例的集合。

0

好點,其實我試過了。問題是,我接着對關係兩側的mappedBy屬性提出了投訴,這是真的,但是無效。 我想知道一個簡單的@ManyToMany與一些聰明的自定義查詢來獲取朋友可能是一個解決方案: ManyToMany會生成一個連接表user_idfriend_id,但查詢將匹配任何一個字段,返回所有匹配的用戶要麼是friend_id要麼是user_id即是。 任何想法?

0

這當然是一個很好的解決方案,但我還沒有完全銷售。基本上,爲了得到朋友,我不得不合並這兩個集合,這是非常不滿意的。

在hibernate中是否絕對沒有辦法創建冪等的自反關係?

0

我今天也有同樣的問題。

@Entity 
@Table(name="users") 
public class User { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="userid") 
    protected Long id = null; 
    @ManyToMany 
    protected List<User> friends = null 
} 

應該沒問題,我用了類似的結構。不過,我得到了延遲加載異常,並且在將fetchType設置爲EAGER時,我收到了有關遞歸初始化包的問題。

我如何固定我的問題:在查詢中使用,以獲取「用戶」,這樣做:

from User as u left join fetch u.friends 

這將初始化的朋友該實體的名單。不過要注意的是,它並沒有初始化來自這些朋友的任何朋友。實際上這是一件好事。