2016-02-27 42 views
0
@Document(collection = "users") 
    public class User { 

     @Id 
     private String id; 

     @DBRef(lazy = true) 
     private Set<User> following = new HashSet<>(); 
} 

比如我做的somethink這樣春天的MongoDB DBREF一對多如何實現

User one = new User(); 
User two = new User(); 
one.follow(two); 
userRepository.save(one); 

這一刻,所有的工作權利。但在那之後

two.follow(one); 
userRepository.save(two); 

當我試圖讓兩個用戶之一,我已經掛程序, 我認爲它淡然說: 用戶一個裝有包含用戶兩個列表,但是用戶進行的兩次包含用戶的一個列表包含此用戶的列表,並最終我有循環。 創建鏈接兩個對象的附加文檔的最佳方式是?

回答

0

如果您的文檔有一個DBRef那麼當它被加載時,所有文檔都是由DBRef所引用的。

所以,如果User oneDBRefUser twoUser twoDBRefUser one

結果將是一個無限循環(導致您掛起)。

即,一個負載二,二然後加載一個其進而加載兩個...

(1 - > 2 - > 1 - > 2 - > 1 - > 2)

雖然我不能想想你想在任何情況下使用稱爲Manual Referencing的技術來實現這種參照的理由。

這基本上意味着包括與任何其他用戶關聯的任何用戶的_id。通過這種方式,當您加載用戶時,您只能加載可用於將每個用戶加載到數據庫之外的字符串列表。

注意:如果您刪除一個用戶,您將不得不在「userReference」字段中找到該用戶的所有出現並將其刪除。

+0

THX,偉大的答案;) – BabyGluk

+0

@BabyGluk感謝,看到https://docs.mongodb.org/manual/reference/database-references/#manual-references的詳細信息! – Hughzi