2014-04-29 110 views
4

有對象的經典POJO如下:春MongoDB的數據不能用「查找」查詢獲取@DBRef對象

@Document 
public class MyPojo { 
    @DBRef 
    @Field("otherPojo") 
    private List<OtherPojo> otherPojos; 
} 

而且OtherPojo.java

public class OtherPojo{ 
    @Id 
    private ObjectId _id; 
    private String someOtherFields; 
} 

我無法級聯保存這些,但我通過首先保存DBRefs然後保存我的POJO列表來解決它,但仍然當我嘗試獲取所有列表或使用下面的代碼查詢它們中的一些時:

Query query = new Query(Criteria.where("myPojo.blabla").is("blabla")); 
List<MyPojo> resultList = mongoTemplate.find(query, MyPojo.class, "myCollection"); 

返回我空的DBREFS列表,它計算真實。例如:保存了10個DBRef,它返回10個空對象,但其基元類型和其他類型不是DBRref都是非空的。 我該如何處理?

我我的對象保存如下:

for (MyPojo pojo : somePojoList) { 
    for (OtherPojo otherPojo : pojo.getOtherPojos()) { 
     mongoTemplate.save(otherPojo, "myCollection"); 
    } 
} 

// ... 

mongoTemplate.insert(myPojoList, "myCollection"); 

編輯: OK,現在我知道,當我節省otherPojos我不指定集合名稱,我可以接他們(感謝@ jmen7070)。但是我必須在那裏寫myCollection,因爲我總是放棄並重新創建它們。這是一個用例。那麼我怎麼能說「找到方法來使用相同的集合來獲取DBRefs」?

+0

你能提供有關你如何保存在數據庫中的對象更詳細? – jmen7070

+0

更新了我的問題.. –

回答

2

正如你可以看到docs

的映射框架不處理級聯撲救。如果更改 由Person對象引用的客戶對象,必須單獨保存 Account對象。調用保存在Person對象上的 不會自動將帳戶對象保存在屬性帳戶中。

所以,首先,你必須保存otherPojos列表的每個對象。之後,你可以保存MyPojo例如:

MyPojo pojo = new MyPojo(); 
OtherPojo otherPojo = new OtherPojo(); 
OtherPojo otherPojo1 = new OtherPojo(); 

pojo.setOtherPojos(Arrays.asList(otherPojo, otherPojo1)); 

mongoTemplate.save(otherPojo); 
mongoTemplate.save(otherPojo1); 

mongoTemplate.save(pojo); 

更新: 你救了一個對象:

for(MyPojo pojo : somePojoList){ 
      for(OtherPojo otherPojo : pojo.getOtherPojos()){ 
       mongoTemplate.save(otherPojo,collectionname); 
      } 
     } 

所有otherPojo對象將在名爲 「集合名」 被保存在收藏..

但你myPojo對象有$裁判的otherPojo集合..

"otherPojo" : [ 
     { 
      "$ref" : "otherPojo", 
      "$id" : ObjectId("535f9100ad52e59815755cef") 
     }, 
     { 
      "$ref" : "otherPojo", 
      "$id" : ObjectId("535f9101ad52e59815755cf0") 
     } 
    ] 

所以, 「集合名」 變量

mongoTemplate.save(otherPojo,collectionname); 

必須是 「otherPojo」。

@Document(collection="otherPojos") 
public class OtherPojo{ 

@Id 
private ObjectId _id; 
private String someOtherFields; 

} 

,並通過使用mongoTemplate

mongoTemplate.save(otherPojo); 
的重載save()方法來保存otherPojo對象:

爲了避免混淆,我建議指定的收集保存與OtherPojo註釋@Doucument對象

這樣,你將有myPojo文檔的有效$裁判

更新2:

在這種情況下,您想要將父母和孩子對象存儲在同一個集合中。

要做到這一點,你可以使用this approach

+0

不!!你誤解了,再讀一遍: '好吧,現在我不能級聯保存這些,但我通過先保存DBRefs然後保存我的pojo列表來克服它,但仍然當我嘗試獲取所有列表或查詢其中的一些列表時用下面的代碼:' –

+0

好吧,我遵循你的建議,我現在成功地獲取它們,但我必須指定一個集合名稱。我可以給它一個不同的集合名稱解決它? –

+0

我不明白你最後的問題,對不起)你的目標是什麼?你想要保存哪些對象? – jmen7070